La parola chiave synchronized
è un modo per garantire la sicurezza del thread. Attenzione: c'è (molto) più sicurezza del thread che deadlock, o aggiornamenti mancanti a causa di due thread che incrementano un int senza sincronizzazione.
Si consideri la seguente classe:
class Connection {
private boolean connected;
synchronized void setConnected(boolean connected){
this.connected = connected;
}
synchronized boolean isConnected(){
return connected;
}
}
Se più thread condividono un'istanza di Connection
e un thread chiama setConnected(true)
, senza synchronized
è possibile che altri thread continuo a vedere isConnected() == false
. La parola chiave synchronized
garantisce che tutti i thread vedano il valore corrente del campo.
In termini più tecnici, la parola chiave synchronized
assicura una barriera di memoria (suggerimento: google).
In più: ogni scrittura effettuata prima di rilasciare un monitor (cioè, prima di lasciare un blocco synchronized
) è garantita per essere vista da ogni lettura effettuata dopo aver acquisito lo stesso monitor (cioè, dopo aver inserito un blocco di sincronizzazione sullo stesso oggetto). In Java, c'è qualcosa chiamato , prima di (suggerimento: google), che non è così banale come "Ho scritto il codice in questo ordine, quindi le cose vengono eseguite in questo ordine". L'utilizzo di synchronized
è un modo per stabilire una relazione di successo prima e garantire che i thread vedano la memoria come ci si aspetterebbe che fossero visibili.
Un altro modo per ottenere le stesse garanzie, in questo caso, sarebbe eliminare la parola chiave synchronized
e contrassegnare il campo volatile
. Le garanzie fornite da volatile
sono le seguenti: tutte le scritture effettuate da un thread prima di una scrittura volatile sono garantite per essere visibili a un thread dopo una successiva lettura volatile dello stesso campo.
Come nota finale, in questo caso particolare, potrebbe essere preferibile utilizzare un campo volatile
anziché synchronized
di accesso, in quanto i due approcci offrono le stesse garanzie e l'approccio -field volatile
permette accessi simultanei al campo da diversi thread (che potrebbe migliorare le prestazioni se la versione synchronized
presenta troppa contesa).
fonte
2013-04-05 07:24:13
Il modificatore sincronizzato ha senso solo se più di un thread sta per tentare di accedere alla variabile 'connected' - almeno questa è la mia comprensione. –
Si prega di consultare http://stackoverflow.com/questions/11459543/java-synchronized-getters-and-setters. Risponde alla tua domanda e la inserisce piacevolmente in un contesto più ampio. – prashant
leggi questi Q + A http://stackoverflow.com/questions/11459543/java-synchronized-getters-and-setters – Zelldon