私は、2 つのスレッド間で共有される変数はスレッドローカルにキャッシュでき、揮発性として宣言する必要があると信じていました。しかし、その信念は最近、チームメイトによって異議を唱えられました。次の場合に 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
...
}
}
}
ここで私の主張は、Worker (子) スレッドがスレッド内の Worker オブジェクトの変数「値」をキャッシュし、値を 1 に設定しながらそのコピーだけを更新した可能性があるということです。そのような場合、メイン スレッドは、更新された値が表示されない場合があります。
しかし、私のチームメイトは、「値」へのアクセスはオブジェクト (ワーカー) を介して行われているため、両方のスレッドが異なる値を参照できるため、両方のスレッドが「ワーカー」オブジェクト自体の個別のコピーを保持している場合にのみ可能であると考えています。 (これはさらに、スレッドの作成には、すべての共有オブジェクトのディープ コピーの作成が含まれることを意味します)。
すべての共有オブジェクトの完全に異なるコピーを各スレッドが保持するのは非常に非効率的であるため、これは真実ではないことがわかりました。したがって、私は深刻な疑問を抱いています。メインスレッドで「worker.value」を実行すると、子スレッドで「this.value」を実行する場合とは異なるメモリ位置が参照されますか? 子 (ワーカー) スレッドは「値」をキャッシュしますか?
よろしく。