我有下一个代码:
boolean signal;
@Test
public void test() throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (!signal){
// empty loop body
}
}
});
thread.start();
Thread.sleep(1000);
signal = true;
thread.join();
}
由于在线程中创建signal
变量的本地副本,它运行无限循环。我知道我可以通过制作signal
变量volatile
来解决这个问题。但是如果在我的循环中添加synchronized
块(甚至为空),循环也可以成功退出:
boolean signal;
@Test
public void test() throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (!signal){
synchronized (this) {
}
}
}
});
thread.start();
Thread.sleep(1000);
signal = true;
thread.join();
}
synchronized
如何更新线程内的signal
值?
答案 0 :(得分:1)
Synchronized不会更新信号值本身,它基本上只放置几个标志,以避免两个线程同时使用同一个对象;类似于:MonitorEnter和MonitorExit。
第一个锁定对象,第二个释放。
请查看以下文章:how-the-java-virtual-machine-performs-thread-synchronization。
请注意文章很旧;但据我所知,背后的逻辑仍然存在。