【发布时间】:2012-09-06 05:33:35
【问题描述】:
我有一个类似下面的代码,其中一个对象在两个线程(主线程和监视器线程)之间共享。我是否必须全局声明 MyObject 并将其设为 volatile 以确保它将被推送到内存?否则if 语句可以打印“Not null”如果 MyObject 只被线程本地访问并且没有声明为 volatile,对吧?
public static void main(String[] args) {
MyObject obj = MyObjectFactory.createObject();
new Monitor(obj).start();
Thread.sleep(500);
if(obj == null)
System.out.println("Null");
else
System.out.println("Not null");
}
public void doSomethingWithObject(MyObject obj) {
obj = null;
}
private class Monitor extends Thread {
public Monitor(MyObject obj) {
this.obj=obj;
}
public void run() {
doSomethingWithObject(obj);
}
}
注意:代码示例可能无法编译,因为我是在 Stackoverflow 上自己编写的。将其视为伪代码和真实代码的混合体。
【问题讨论】:
-
使用可编译的代码示例更容易说明您要演示的内容:)
-
@Affe:抱歉,我在帖子中做了一个注释,解释了为什么它不能编译。 :-)
标签: java multithreading synchronization volatile