(проблема синхронизации Java) Как мой заголовок, могу ли я получить доступ к статической переменной в синхронизированном блоке? Это вызовет непоследовательность? Может ли кто-нибудь рассказать мне о деталях недостатков или преимуществ доступа к статическому синхронизированному блоку.Доступ к статической переменной в синхронизированном блоке
ответ
Могу ли я получить доступ к статической переменной в синхронизированном блоке?
Да, вы можете.
Будет ли это причиной непоследовательности?
Статические средства, общие для всех экземпляров этого класса в JVM. Общие ресурсы: не поточно-безопасный. Статические переменные не являются потокобезопасными. Поэтому, если несколько потоков пытаются получить доступ к статической переменной, это может привести к несогласованности.
Пути, которые я знаю, чтобы синхронизировать доступ к статической переменной.
Синхронизировать на статическом объекте.
public class SomeClass{ private static int sum = 0; private static final Object locker = new Object(); public void increaseSum() { synchronized (locker) { sum++; } } }
Синхронный статический метод.
public class SomeClass { private static int sum = 0; public static synchronized void increaseSum() { sum++; } }
Синхронизировать на объект класса
public class SomeClass { private static int sum= 0; public void increaseSum() { synchronized (SomeClass .class) { sum++; } } }
Что делать, если статическая переменная является общедоступной переменной, используемой в разных классах в одном приложении. Будут ли какие-либо несоответствия? –
Конечно, есть вероятность несостоятельности, если одновременно выполняются несколько потоков, выполняющих код в разных классах, которые пытаются изменить/прочитать общую переменную. – NINCOMPOOP
Могу ли я использовать один из вышеперечисленных методов, чтобы сделать его потоковым? –
- 1. Доступ к переменной в блоке
- 2. Wrap CopyOnWriteArrayList в синхронизированном блоке
- 3. Доступ к статической переменной значение
- 4. Доступ к глобальной статической переменной
- 5. Необходимость объекта в синхронизированном блоке
- 6. Прекращение резьбы в синхронизированном блоке
- 7. Неожиданный код в синхронизированном блоке
- 8. Доступ к переменной класса в блоке Struct.new
- 9. доступ к статической переменной в C++
- 10. Доступ к статической переменной в другом классе
- 11. Доступ к статической переменной в кавычках внутри статической функции
- 12. Необходимость волатильной записи массива в синхронизированном блоке
- 13. Доступ к блокировке по потоку с использованием подклассов по статической переменной родительского класса в java
- 14. Доступ к общедоступной статической переменной вне класса
- 15. Доступ к переменной PHP из статической функции
- 16. Доступ к статической переменной возвращает пустую строку
- 17. Доступ к статической переменной, используя переменную - PHP
- 18. Доступ к статической переменной из функции друга
- 19. Доступ к статической переменной из разных сборок
- 20. Доступ к статической переменной из другого класса
- 21. Доступ к статическому методу из статической переменной
- 22. Доступ к статической переменной от службы
- 23. Позвольте конструктору получить доступ к статической переменной
- 24. Доступ к статической переменной из класса
- 25. Поведение режима сна в синхронизированном блоке
- 26. Требуется ли выполнить ConcurrentHashMap в синхронизированном блоке?
- 27. Выполняется ли java.util.concurrent.ConcurrentHashMap.putIfAbsent в синхронизированном блоке?
- 28. Java вызова других методов в синхронизированном блоке
- 29. Вызов таймера java в синхронизированном блоке кодов
- 30. Доступ к статической переменной из класса, хранящегося в переменной
* я могу получить доступ к статической переменной в синхронизированный блок? * .. Попробуйте это. * Это вызовет непоследовательность? * Что заставляет вас думать так? –
Если у вас есть статическая переменная, синхронизация должна быть реализована с помощью статического метода объекта, который содержит такую переменную, или с помощью синхронизированного блока с синхронизацией в классе объекта, который содержит эту переменную. – Mike