class Counter
{
public int i=0;
public void increment()
{
i++;
System.out.println("i is "+i);
System.out.println("i/=2 executing");
i=i+22;
System.out.println("i is (after i+22) "+i);
System.out.println("i+=1 executing");
i++;
System.out.println("i is (after i++) "+i);
}
public void decrement()
{
i--;
System.out.println("i is "+i);
System.out.println("i*=2 executing");
i=i*2;
System.out.println("i is after i*2"+i);
System.out.println("i-=1 executing");
i=i-1;
System.out.println("i is after i-1 "+i);
}
public int value()
{
return i;
} }
class ThreadA
{
public ThreadA(final Counter c)
{
new Thread(new Runnable(){
public void run()
{
System.out.println("Thread A trying to increment");
c.increment();
System.out.println("Increment completed "+c.i);
}
}).start();
}
}
class ThreadB
{
public ThreadB(final Counter c)
{
new Thread(new Runnable(){
public void run()
{
System.out.println("Thread B trying to decrement");
c.decrement();
System.out.println("Decrement completed "+c.i);
}
}).start();
}
}
class ThreadInterference
{
public static void main(String args[]) throws Exception
{
Counter c=new Counter();
new ThreadA(c);
new ThreadB(c);
}
}
上記のコードでは、ThreadA は最初に Counter オブジェクトにアクセスし、いくつかの追加操作を実行するとともに値をインクリメントしました。初めて ThreadA にキャッシュされた i の値がありません。ただし、i++ の実行後 (最初の行)、値がキャッシュされます。その後、値が更新されて 24 になります。プログラムによると、変数 i は揮発性ではないため、変更は ThreadA のローカル キャッシュで行われます。
ThreadB が decrement() メソッドにアクセスすると、i の値は ThreadA、つまり 24 によって更新されます。