자바에서 스레드 안전 메커니즘을 이해하려고하는데 도움이 필요합니다.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
스레드로부터 안전하기 위해 노력하고, 한 번에 하나 개의 스레드에서만 액세스 할 : I 클래스가 있습니다. 이 프로그램을 실행하면 synchronized
블록 내에 랩핑해도 value
에 하나 이상의 스레드가 작동하는 것을 볼 수 있습니다. 물론이 루프는 무한하지만 그 단지 예를 들어, 나는 몇 초 후에 수동으로이 프로그램을 중지하고, 그래서 나는이 :
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
변경됩니다. 누군가가 내게 왜 이렇게 설명 할 수 있니? 그리고이 전역 변수를 안전하게하는 방법은 무엇입니까?
이 예제에서는 긴 정적 만들 의도하지 되었습니까? 다른 경우에는 threadsafety 문제가 없기 때문입니다. –
내 대답을 확인하십시오. 귀하의'MyThread' 클래스는'Thread'를 확장하지 않아야하고'Runnable'을 구현해야합니다. – Gray