【发布时间】:2015-04-01 07:50:50
【问题描述】:
我正在阅读this 教程。我了解 volatile 关键字的用法。但是,当我尝试在不使用 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,如果是,那么该怎么做? 谢谢。
【问题讨论】:
-
请提供异常堆栈跟踪。
标签: java multithreading thread-safety