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();
}