我正在通過this教程。我瞭解volatile關鍵字的用法。但是,當我試圖達到相同的結果,而不使用volatile關鍵字與同步塊中的關注變量的操作,它不起作用。它引發IllegalMonitorStateException。這是我試過的修改過的代碼。用同步塊替換volatile不起作用
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(); }
}
}
}}}
我想知道的是,在這種情況下是揮發性的替換用synchronized塊,如果是,那麼該怎麼辦呢? 謝謝。
請提供異常堆棧跟蹤。 – GhostCat 2015-04-01 07:58:18