Java如何同步更新线程值?

时间:2016-07-08 14:55:27

标签: 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
            }
        }
    });
    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值?

1 个答案:

答案 0 :(得分:1)

Synchronized不会更新信号值本身,它基本上只放置几个标志,以避免两个线程同时使用同一个对象;类似于:MonitorEnter和MonitorExit。

第一个锁定对象,第二个释放。

请查看以下文章:how-the-java-virtual-machine-performs-thread-synchronization

请注意文章很旧;但据我所知,背后的逻辑仍然存在。