В этой статье на примерах анализируется использование энергозависимой и синхронизированной многопоточности в Java. Поделитесь этим со всеми для справки. Конкретный метод реализации заключается в следующем:
Скопируйте код следующим образом: package com.chzhao;
общественный класс Volatiletest расширяет поток {
частный статический счетчик int = 0;
общественный недействительный запуск () {
считать++;
}
public static void main(String[] args) {
Потоки [] = новая тема [10000];
for (int i = 0; i < threads.length; i++) {
потоки [i] = новый Volatiletest();
}
for (int i = 0; i < threads.length; i++) {
потоки[i].start();
}
пытаться {
Thread.sleep(1000);
} catch (InterruptedException e) {
е.printStackTrace();
}
System.out.println(счет);
}
}
Код аналогичен приведенному выше. Ожидаемый результат — 10 000. Однако, поскольку count++ не является потокобезопасным, результат часто будет меньше 10 000.
Чтобы решить эту проблему, было добавлено ключевое слово heating.
Скопируйте код следующим образом: package com.chzhao;
общественный класс Volatiletest расширяет поток {
частный изменчивый статический счетчик int = 0;
общественный недействительный запуск () {
считать++;
}
public static void main(String[] args) {
Потоки [] = новая тема [10000];
for (int i = 0; i < threads.length; i++) {
потоки [i] = новый Volatiletest();
}
for (int i = 0; i < threads.length; i++) {
потоки[i].start();
}
пытаться {
Thread.sleep(2000);
} catch (InterruptedException e) {
е.printStackTrace();
}
System.out.println(счет);
}
}
После модификации часто выводятся значения, отличные от 10000.
Измените его на синхронизированную форму, код выглядит следующим образом:
Скопируйте код следующим образом: package com.chzhao;
общественный класс SynchronizedTest расширяет поток {
частный статический счетчик int = 0;
общественный недействительный запуск () {
синхронизировано (LockClass.lock) {
считать++;
}
}
public static void main(String[] args) {
Потоки [] = новая тема [10000];
for (int i = 0; i < threads.length; i++) {
потоки [i] = новый SynchronizedTest();
}
for (int i = 0; i < threads.length; i++) {
потоки[i].start();
}
пытаться {
Thread.sleep(2000);
} catch (InterruptedException e) {
е.printStackTrace();
}
System.out.println(счет);
}
}
Скопируйте код следующим образом: package com.chzhao;
общественный класс LockClass {
общедоступный статический байт [] блокировка = новый байт [0];
}
После этой модификации выход составит 10000.
Означает ли это, что ключевое слово volating совершенно бесполезно? Только синхронизация может гарантировать потокобезопасность?
проиллюстрировать:
Язык Java содержит два встроенных механизма синхронизации: синхронизированные блоки (или методы) и изменчивые переменные. Оба механизма предложены для обеспечения безопасности потоков кода. Изменчивые переменные менее синхронизированы (но иногда проще и дешевле), а их использование также более подвержено ошибкам. Летучие переменные в языке Java можно рассматривать как «менее синхронизированные»; по сравнению с синхронизированными блоками, изменчивые переменные требуют меньшего количества кода и меньших накладных расходов во время выполнения, но они могут обеспечить функциональность — это только часть синхронизации.
Другими словами, в некоторых случаях volitile использовать удобнее, чем синхронизированный, но синхронизация, конечно, хуже.
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.