Java のスレッド セーフ メカニズムを理解しようとしていますが、助けが必要です。私はクラスを持っています:
public class ThreadSafe {
private Executor executor = new ScheduledThreadPoolExecutor(5);
private long value = 0;
public void method() {
synchronized (this) {
System.out.println(Thread.currentThread());
this.value++;
}
}
private synchronized long getValue() {
return this.value;
}
public static void main(String... args) {
ThreadSafe threadSafe = new ThreadSafe();
for (int i = 0; i < 10; i++) {
threadSafe.executor.execute(new MyThread());
}
}
private static class MyThread extends Thread {
private ThreadSafe threadSafe = new ThreadSafe();
private AtomicBoolean shutdownInitialized = new AtomicBoolean(false);
@Override
public void run() {
while (!shutdownInitialized.get()) {
threadSafe.method();
System.out.println(threadSafe.getValue());
}
}
}
}
value
ここでは、一度に 1 つのスレッドだけがアクセスできるように、スレッドを安全にしようとしています。このプログラムを実行していると、ブロックvalue
内にラップしても、複数のスレッドが動作していることがわかります。synchronized
もちろん、このループは無限になりますが、単なる例です。数秒後にこのプログラムを手動で停止しているので、次のようになります。
2470
Thread[pool-1-thread-3,5,main]
2470
Thread[pool-1-thread-5,5,main]
2470
Thread[pool-1-thread-2,5,main]
異なるスレッドがこれにアクセスして変更していvalue
ます。誰かが私になぜこれがそうなのか説明できますか? そして、このグローバル変数をスレッドセーフにする方法は?