[英]Replacing volatile with synchronized block is not working
我正在閱讀本教程。 我了解了可變關鍵字的用法。 但是,當我嘗試在同步塊中對關注變量進行操作而未使用volatile關鍵字的情況下達到相同的結果時,則無法正常工作。 它引發IllegalMonitorStateException。 這是我嘗試的修改后的代碼。
public class VolatileTest {
private static Integer MY_INT = 0;
public static void main(String[] args) {
new ChangeListener().start();
new ChangeMaker().start();
}
static class ChangeListener extends Thread {
@Override
public void run() {
synchronized(MY_INT){
int local_value = MY_INT;
while ( local_value < 5){
if( local_value!= MY_INT){
System.out.format("Got Change for MY_INT : {0}", MY_INT);
local_value= MY_INT;
try {
MY_INT.wait();
} catch (Exception e) { e.printStackTrace(); }}
}
}
}
}
static class ChangeMaker extends Thread{
@Override
public void run() {
synchronized(MY_INT){
int local_value = MY_INT;
while (MY_INT <5){
System.out.format("Incrementing MY_INT to {0}", local_value+1);
MY_INT = ++local_value;
try {
MY_INT.notify();
} catch (Exception e) { e.printStackTrace(); }
}
}
}}}
我想知道的是,在這種情況下,可以使用同步塊替換掉volatile,如果是,那么該怎么做? 謝謝。
問題在這里:
MY_INT = ++local_value;
MY_INT
是一個Integer
變量,當您為其分配一個新值時,您將在此處鎖定的對象:
synchronized(MY_INT){
將與您在此處通知的對象不同:
MY_INT.notify();
...這將導致異常。
解決方案是使鎖對象成為static final
。 顯然,這意味着您無法分配給它...但這就是重點!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.