Sto cercando di capire il meccanismo di sicurezza del thread in Java e ho bisogno di aiuto. Ho una classe:Variabile globale sicura thread in 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());
}
}
}
}
Qui sto cercando di fare il filo value
sicura, a cui accedere da un solo thread alla volta. Quando eseguo questo programma, vedo che c'è più di un thread che funziona su value
anche se lo avvolgo nel blocco synchronized
. Naturalmente questo ciclo sarà infinito ma è solo un esempio, sto fermando manualmente questo programma dopo pochi secondi, in modo da avere:
2470
Thread[pool-1-thread-3,5,main]
2470
Thread[pool-1-thread-5,5,main]
2470
Thread[pool-1-thread-2,5,main]
Diversi fili accedono e cambiare questo value
. Qualcuno può spiegarmi perché è così? E come rendere sicuro questo thread variabile globale?
non era sua intenzione di rendere lunga statica in questo esempio? Perché in ogni altro caso non esiste un problema di sicurezza del thread. –
Assicurati di notare la mia risposta. La tua classe 'MyThread' dovrebbe _non_ estendere' Thread' e _should_ implementa 'Runnable'. – Gray