Volatile переменная в Java

Для создания общей глобальной переменной, которую будут использовать несколько потоков используется слово volatile.

Создадим два потока. Первый будет добавлять 1 к глобальной переменной и как только он добавил 1 к глобальной переменной, во втором потоке будет происходить вывод на консоль нового значения глобальной переменной. Этот процесс будет продолжаться пока i не станет 8.

Пример программы:

public class VolatileExample { static volatile int i;//объявим i volatile public static void main(String[] args) { new MyThread1().start();//запустим потоки new MyThread2().start(); } static class MyThread1 extends Thread { @Override public void run() { while(i<8){ System.out.println("inc i = " + (++i)); try{ //Sleep для остановки текущего потока //на заданное количество миллисекунд //в данном случае 100. Thread.sleep(100); } catch(InterruptedException e){} } } } static class MyThread2 extends Thread { @Override public void run() { int localvar = i; while(i<8){ if(localvar != i){ //Если бы i не был volatile то здесь //была бы копия i и она вечно была //бы 0 и поток бы ничего не вывел. System.out.println("new i = " + i); localvar = i; } } } } }

Вывод:

Search Icon

Как уже было сказано, если бы i была не volatile, то мы бы не работали непосредственно с переменной i, которая в main, а в каждом потоке бы создавалась копия переменной i и каждый поток работал бы со своей копией i.

Метод join в Java

Узнайте, как метод join() в Java приостанавливает текущий поток до завершения другого. Примеры кода и объяснение работы с потоками для эффективной синхронизации.
Time to read: 11

Синхронизация в Java с помощью Synchronized

Изучите synchronized в Java: как организовать поочередный доступ потоков к общему ресурсу. Пример кода с пояснением работы синхронизации.
Time to read: 13

Synchronized static в Java

Разница между synchronized и synchronized static в Java. Как блокировка на уровне класса влияет на все объекты. Практические примеры и выводы.
Time to read: 15