【发布时间】:2017-10-17 17:46:09
【问题描述】:
我的代码是
package threadrelated;
import threadrelated.lockrelated.MyNonBlockingQueue;
public class VolatileTester extends Thread {
MyNonBlockingQueue mbq ;
public static void main(String[] args) throws InterruptedException {
VolatileTester vt = new VolatileTester();
vt.mbq = new MyNonBlockingQueue(10);
System.out.println(Thread.currentThread().getName()+" "+vt.mbq);
Thread t1 = new Thread(vt,"First");
Thread t2 = new Thread(vt,"Secondz");
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(Thread.currentThread().getName()+" "+vt.mbq);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" before "+mbq);
mbq = new MyNonBlockingQueue(20);
try {
Thread.sleep(TimeUnit.SECONDS.toMillis(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" after "+mbq);
}
}
输出是
main threadrelated.lockrelated.MyNonBlockingQueue@72fcb1f4
Secondz before threadrelated.lockrelated.MyNonBlockingQueue@72fcb1f4
First before threadrelated.lockrelated.MyNonBlockingQueue@72fcb1f4
Secondz after threadrelated.lockrelated.MyNonBlockingQueue@7100650c
First after threadrelated.lockrelated.MyNonBlockingQueue@7100650c
main threadrelated.lockrelated.MyNonBlockingQueue@7100650c
这表明当第一个线程将成员变量分配给新对象时,其他线程也是可见的。即使“mbq”没有被声明为 volatile。
我使用断点来尝试不同的操作顺序。但我的观察是一个线程可以立即看到其他线程的影响。
作为 object 的类成员不需要 volatile 吗?它们总是与主存储器同步吗?只有原始成员变量(int、long、boolean 等?)需要 Volatile
【问题讨论】:
-
您希望代码在您尝试时碰巧可以工作,还是按标准保证可以工作的代码?
-
"保证":)
-
@shmosel 抱歉。复制粘贴错误。添加了缺失的行。
标签: java multithreading volatile