java—并发问题使volitile无法工作

ghhaqwfi  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(374)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

上个月关门了。
改进这个问题
b线程读取两个全局变量,a线程写入两个全局变量。
怎么可能 second 远大于 first ?

public class ThreadTest {
    private static volatile int first = 0;
    private static volatile int second = 0;

    private static class ReaderThread extends Thread {
        @Override
        public void run() {
            while (first < 10000) {
                if (first != second) {
                    System.out.println("ThreadB------first = " + first + ", second = " + second);
                }
            }
            System.out.println("ThreadB------first = " + first + ", second = " + second);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new ReaderThread().start();
        Thread.sleep(1000L);
        while (first < 10000){
            first++;
            second++;
        }
    }
}
ThreadB------first = 3296, second = 3535
ThreadB------first = 7615, second = 7663
ThreadB------first = 8179, second = 8192
ThreadB------first = 8635, second = 8662
ThreadB------first = 9151, second = 9177
ThreadB------first = 10000, second = 10000
ThreadB------first = 10000, second = 10000

那么发生了什么,如何解决这个问题呢?

wlwcrazw

wlwcrazw1#

满足“if”之后,执行一些运行速度相对较慢的字符串串联。在从左到右计算println调用的参数表达式时,在读取“first”和读取“second”之间可能会经过一些未知的时间长度(可能是数百个机器周期)。
尝试重新编码为

int f = first, s = second;
   if (f != s) {
        System.out.println("ThreadB------first = " + f + ", second = " + s);
   }

看看那是什么样子。
更大的问题是,如果这是一些真实代码的片段,那么它似乎不能提供任何有用的同步。每个整数都有立即可见的效果,但这两个值之间没有同步。我能看到的唯一保证是,正如所写的,你永远看不到‘second’的值小于‘first’的值。

相关问题