Java如何同步更新线程值?
我有下一个代码:Java如何同步更新线程值?,java,multithreading,Java,Multithreading,我有下一个代码: boolean signal; @Test public void test() throws InterruptedException { Thread thread = new Thread(new Runnable() { @Override public void run() { while (!signal){ // empty loop body
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();
}
由于在线程中创建信号
变量的本地副本,它运行无限循环。我知道我可以通过使我的信号
可变易失性
来修复它。但如果在我的循环中添加synchronized
块(甚至为空),循环也可以成功退出:
synchronized
如何在线程内更新我的signal
值 Synchronized不更新信号值本身,它基本上只是放置几个标志,以避免两个线程同时使用同一对象;类似于:MonitorEnter和MonitorExit
第一个锁定对象,第二个释放
请看以下文章:
请注意这篇文章很旧;但据我所知,背后的逻辑仍然存在。您的第二个程序永远不会退出是完全合法的-您的JVM/CPU体系结构似乎应用了比JLS要求的更强大的内存模型。有趣的阅读:他在《我知道》中展示了一个密切相关的示例,但为什么在我的第二个示例中添加synchronized block to loop更新信号变量呢?因为没有synchronized的是一个自私的线程;它意味着;它将停止,直到完成它的工作;任何线程都可能成为自私线程,如果在循环中没有屈服/睡眠/阻塞操作(如I/O),那么现在,当您放置同步线程时,您会使自私线程不自私,因为对象“信号”上有阻塞操作,行为本身在很大程度上取决于您运行它的基础设施;但基本上你有两个线程1)主线程2)由于第二个线程是自私的,它不会让主线程继续。。。
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();
}