2014-11-04 28 views
2

我syncronized靜態方法和非靜態方法如下:靜態syncronized方法和非靜態同步方法可以在靜態成員變量和兩個工作這可能會導致意外的行爲

public class Demo { 

static int myvalue; 

synchronized static public void getStatic() { 

    myvalue = 2; 
} 

synchronized public void get() { 

    myvalue = 1; 
} 
} 

然後從Thread 1我只調用靜態方法,並從線程2我只調用非靜態方法。

由於一個調用被鎖定在對象上而另一個被鎖定在類上,所以沒有等待獲得鎖定。

所以,這意味着這兩個函數可以同時運行。

現在,事實是這兩個函數在靜態成員變量上工作(在示例中爲myvalue)。這可能是多線程應用程序中的一個問題。爲什麼Java創建者沒有考慮到這一點?處理這種情況的正確方法是什麼?

回答

3

爲什麼在Java的創造者並沒有考慮到這一點?

他們這樣做了,這就是爲什麼你可以選擇同步類和對象的水平。

什麼可以解決這種情況的正確方法?

您必須在get()方法中使用synchronized(Demo.class) {...}

0

在單個對象或類上同步,例如,

public class Demo { 

    static int myvalue; 

    static public void getStatic() { 
     synchronized(Demo.class) { 
      myvalue = 2; 
     } 
    } 

    public void get() { 
     synchronized(Demo.class) { 
      myvalue = 1; 
     } 
    } 
} 
+2

這不會起作用,因爲在'static'方法中沒有'this'參考可用。你可以做的是在兩種情況下同步'Demo.class'。 – misberner 2014-11-04 23:33:51

+1

但是在一個靜態方法中,沒有「this」的概念。 – user1883212 2014-11-04 23:34:02

+0

是的,錯過了,我會更新。 – spudone 2014-11-04 23:36:48

相關問題