我曾经认为,在两个线程之间共享的任何变量都可以在线程本地缓存,并且应该声明为volatile.但这种信念最近遭到了队友的挑战.我们试图弄清楚在下列情况下是否需要挥发性物质.
class Class1
{
void Method1()
{
Worker worker = new Worker();
worker.start();
...
System.out.println(worker.value); // want to poll value at this instant
...
}
class Worker extends Thread
{
int value = 0; // Should this be declared as a volatile?
public void run()
{
...
value = 1; // this is the only piece of code that updates value
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的论点是,有可能Worker(子)线程可以缓存线程中Worker对象的变量"value",并在将值设置为1时更新它的副本.在这种情况下,主线程可能看不到更新的值.
但是我的队友认为,由于对"值"的访问是通过对象(worker)进行的,因此两个线程都可以看到不同的值,只有两个线程都维护"worker"对象本身的单独副本才有可能. (这将进一步意味着创建线程涉及创建所有共享对象的深层副本).
现在我知道这不可能是真的,因为每个线程维护所有共享对象的完全不同的副本是非常低效的.因此,我非常怀疑.在主线程中执行"worker.value"是否引用了与在子线程中执行"this.value"不同的内存位置?子(Worker)线程会缓存"值"吗?
问候.