2013-04-28 57 views
0

(Java同步問題)作爲我的標題,我可以訪問同步塊中的靜態變量嗎?會造成不一致嗎?任何人都可以告訴我訪問靜態變量同步塊的缺點或優點的細節。訪問同步塊中的靜態變量

+0

*我可以訪問靜態變量在同步塊?* ..嘗試。 *它會導致不一致嗎?*是什麼讓你這麼想? – 2013-04-28 15:05:09

+0

如果你有一個靜態變量,同步應該通過持有這樣的變量的對象的一個​​靜態方法來實現,或者通過使用一個同步的塊來對包含該變量的對象的類進行同步。 – Mike 2013-04-28 15:14:00

回答

3

我可以訪問同步塊中的靜態變量嗎?

是的,你可以。

它會導致不一致嗎?

靜態方法在JVM中的該類的所有實例之間共享。共享資源是非線程安全。因此,靜態變量不是線程安全的。因此,如果多個線程嘗試訪問靜態變量,則可能會導致不一致。

我知道的方式來同步對靜態變量的訪問。

  1. 在靜態對象上同步。

    public class SomeClass{ 
         private static int sum = 0; 
         private static final Object locker = new Object(); 
    
         public void increaseSum() { 
          synchronized (locker) { 
          sum++; 
         } 
        } 
        } 
    
  2. 同步靜態方法。

    public class SomeClass { 
        private static int sum = 0; 
    
        public static synchronized void increaseSum() { 
        sum++; 
    } 
    } 
    
  3. 同步類對象

    public class SomeClass { 
        private static int sum= 0; 
    
        public void increaseSum() { 
         synchronized (SomeClass .class) { 
         sum++; 
        } 
        } 
    } 
    
+0

如果靜態變量是在同一應用程序的不同類中使用的公共變量,該怎麼辦?會有什麼不一致嗎? – 2016-08-18 05:36:48

+1

當然,如果有多個線程同時在不同的類中執行代碼,而這些代碼正在嘗試修改/讀取一個公共變量,則存在不一致的可能性。 – NINCOMPOOP 2016-08-20 19:16:54

+0

我可以使用上述方法之一來使其線程安全嗎? – 2016-08-21 13:30:40