2013-04-28 3 views
0

(проблема синхронизации Java) Как мой заголовок, могу ли я получить доступ к статической переменной в синхронизированном блоке? Это вызовет непоследовательность? Может ли кто-нибудь рассказать мне о деталях недостатков или преимуществ доступа к статическому синхронизированному блоку.Доступ к статической переменной в синхронизированном блоке

+0

* я могу получить доступ к статической переменной в синхронизированный блок? * .. Попробуйте это. * Это вызовет непоследовательность? * Что заставляет вас думать так? –

+0

Если у вас есть статическая переменная, синхронизация должна быть реализована с помощью статического метода объекта, который содержит такую ​​переменную, или с помощью синхронизированного блока с синхронизацией в классе объекта, который содержит эту переменную. – Mike

ответ

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

Что делать, если статическая переменная является общедоступной переменной, используемой в разных классах в одном приложении. Будут ли какие-либо несоответствия? –

+1

Конечно, есть вероятность несостоятельности, если одновременно выполняются несколько потоков, выполняющих код в разных классах, которые пытаются изменить/прочитать общую переменную. – NINCOMPOOP

+0

Могу ли я использовать один из вышеперечисленных методов, чтобы сделать его потоковым? –

Смежные вопросы