我读过Java中的“易失性”允许不同的线程访问同一字段并查看其他线程对该字段所做的更改。如果是这种情况,我预测当第一个和第二个线程完全运行时,“d”的值将增加到 4。但相反,每个线程都会将“d”增加到值 2。
public class VolatileExample extends Thread {
private int countDown = 2;
private volatile int d = 0;
public VolatileExample(String name) {
super(name);
start();
}
public String toString() {
return super.getName() + ": countDown " + countDown;
}
public void run() {
while(true) {
d = d + 1;
System.out.println(this + ". Value of d is " + d);
if(--countDown == 0) return;
}
}
public static void main(String[] args) {
new VolatileExample("first thread");
new VolatileExample("second thread");
}
}
运行该程序的结果是:
第一个线程:倒计时 2. d 的值为 1
第二个线程:倒计时2。d的值为1
第一个线程:倒计时 1。d 的值为 2
第二个线程:倒计时 1。d 的值为 2
我知道如果我在程序中添加关键字“static”,
(即“private static volatile int d = 0;”),“d”将增加到 4。
我知道这是因为 d 将成为整个类共享的变量,而不是每个实例都获得一个副本。
结果如下:
第一个线程:倒计时 2. d 的值为 1
第一个线程:倒计时 1。d 的值为 3
第二个线程:倒计时 2。d 的值为 2
第二个线程:倒计时 1。d 的值为 4
我的问题是,如果 volatile 应该允许在两个线程之间共享“d”,为什么“private volatile int d = 0;”不会产生类似的结果?也就是说,如果第一个线程将 d 的值更新为 1,那么为什么第二个线程不将 d 的值获取为 1 而不是 0?
易失性不允许“共享”任何东西。它只是防止变量在线程本地缓存,以便变量值的更改立即发生。您的 d 变量是一个实例变量,因此由保存它的实例拥有。您需要重新阅读线程教程以重新调整您的假设。
一个不错的参考是here
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)