小编Abh*_*ang的帖子

除了类变量之外的对象的波动性

我曾经认为,在两个线程之间共享的任何变量都可以在线程本地缓存,并且应该声明为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)线程会缓存"值"吗?

问候.

java concurrency multithreading volatile

6
推荐指数
1
解决办法
258
查看次数

标签 统计

concurrency ×1

java ×1

multithreading ×1

volatile ×1