public class Main{
public static void main(String[] args) throws Exception {
// Creating objects for class Check(2 different objects)
Check c = new Check("s1");
Check c1 = new Check("s2");
c.start();c1.start();
}
}
class Check extends Thread{
Check(String name){super(name);}
private Integer ab = 2;
public void run(){
synchronized (ab) {
System.out.println(Thread.currentThread().getName());
for(int i=0;i<10;i++)System.out.print(i+" ");
}
}
}
Qui ho sincronizzato sulla variabile ab. E ho anche creato due diverse istanze di controllo di classe, ma ottengo sempre output per s1 seguito da s2 o viceversa, ma non misto, perché è così? quando ho già creato due oggetti separati (in main), quindi due thread differenti, due diverse variabili ab, quindi come diventa una risorsa condivisa per i due diversi oggetti?Sincronizzazione thread su variabile istanza Integer
B.T.W., non si sta sincronizzando sulla _variabile_, si sta eseguendo la sincronizzazione sull'oggetto a cui la variabile fa riferimento. È una distinzione importante perché alcune persone hanno commesso l'errore di non rendersi conto che la variabile può riferirsi a oggetti diversi in momenti diversi, e alcuni hanno commesso l'errore di non rendersi conto che lo stesso oggetto può essere referenziato da più di una variabile. –
Questo codice è più simile a un codice di prova che a un caso reale, ma se si desidera eseguire la sincronizzazione su un [numero] lock-free, ma sicuro per i thread (https://docs.oracle.com/javase/8/ docs/api/java/lang/Number.html), puoi usare un [AtomicInteger] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html). –
@jameslarge: Capisco, cosa stai dicendo. Non ero preciso su questo perché il mio problema si concentrava su un altro punto. Comunque, grazie. :) – Santanu