关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。
上个月关门了。
改进这个问题
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
那么发生了什么,如何解决这个问题呢?
1条答案
按热度按时间wlwcrazw1#
满足“if”之后,执行一些运行速度相对较慢的字符串串联。在从左到右计算println调用的参数表达式时,在读取“first”和读取“second”之间可能会经过一些未知的时间长度(可能是数百个机器周期)。
尝试重新编码为
看看那是什么样子。
更大的问题是,如果这是一些真实代码的片段,那么它似乎不能提供任何有用的同步。每个整数都有立即可见的效果,但这两个值之间没有同步。我能看到的唯一保证是,正如所写的,你永远看不到‘second’的值小于‘first’的值。