Сообщения

Показаны сообщения с ярлыком "конкурентность в Java"

Ключевое слово volatile в Java

Изображение
Синхронизация в Java возможна с помощью ключевых слов Java synchronized и volatile, а также с помощью блокировок. В Java не может быть synchronized переменной. Использование ключевого слова synchronized с переменной недопустимо и приведет к ошибке компиляции. Вместо использования synchronized переменной в Java вы можете использовать volatile переменную, которая будет указывать потокам JVM читать значение volatile переменной из основной памяти и не кэшировать его локально. Если переменная не используется совместно несколькими потоками, тогда нет необходимости использовать ключевое слово volatile. Пример использования volatile: public class Singleton { private static volatile Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) instance = new Singleton(); } } return instance; } } Мы лениво созда...

Внутренне устройство AtomicInteger

Изображение
Чтобы разобрать использование атомарных операций в Java рассмотрим следующий пример: public class Counter { int counter; public void increment() { counter++; } } В случае однопоточной среды это работает отлично; однако, как только мы разрешаем запись более чем одному потоку, мы начинаем получать противоречивые результаты. Причина этому в операции приращения (counter++), которая может выглядеть как атомарная операция, но на самом деле представляет собой комбинацию трех операций: получение значения, увеличение и обратная запись обновленного значения. Если два потока попытаются получить и обновить значение одновременно, это может привести к потере обновлений. Один из способов управления доступом к объекту - использование блокировок. Этого можно достичь, используя ключевое слово synchronized в сигнатуре метода приращения. Ключевое слово synchronized гарантирует, что только один поток может входить в метод одновременно: public class SynchronizedCounterWi...