Sto guardando alcuni esempi di notifica/attesa e mi sono imbattuto in questo. Capisco che un blocco sincronizzato definisce essenzialmente una sezione critica, ma non presenta una condizione di competizione? Niente specifica quale blocco sincronizzato viene inserito per primo.Esiste una condizione di competizione in questo esempio? Se è così, come potrebbe essere evitato?
public class ThreadA {
public static void main(String[] args){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
try{
System.out.println("Waiting for b to complete...");
b.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread {
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
}
uscita per il sito:
In attesa di b per completare ...
totale è: 4950
Sì, in teoria il nuovo thread potrebbe 'notify()' prima del thread principale chiama 'wait()'. – overthink
Non pensare a un blocco 'sincronizzato' come _preventing_ una gara. Limita semplicemente lo _scope_ della gara. È come una sezione di un corso automobilistico in cui la pista è un'auto troppo stretta per sorpassarsi a vicenda. Stanno ancora correndo, ma devono passare attraverso quella singola sezione. Lo stesso vale per il blocco 'sincronizzato': i thread non stanno correndo _in qui_, ma corrono per _get qui_, e corrono ovunque. –
@jameslarge è stata un'analogia sorprendente! Non ci sono due thread nel blocco sincronizzato contemporaneamente, ma se non specificato esplicitamente non si può dire chi potrebbe arrivare prima, correggere? – trevalexandro