Dans une belle article with some concurrency tips, un exemple a été optimisé pour les lignes suivantes:Différence entre la synchronisation de champ lit et volatile
double getBalance() {
Account acct = verify(name, password);
synchronized(acct) { return acct.balance; }
}
Si je comprends bien, le point de la synchronisation est de faire en sorte que la valeur de acct.balance qui sont lus par ce fil est courant et que toutes les écritures en attente aux champs de l'objet dans acct.balance sont aussi écrites dans la mémoire principale.
L'exemple m'a fait réfléchir un peu: ne serait-il pas plus efficace de déclarer simplement acct.balance (c'est-à-dire le solde de la classe Account) volatile
? Il devrait être plus efficace, vous sauver tous les synchronize
sur les accès à acct.balance et ne verrouillerait pas l'objet entier acct
. Est-ce que je manque quelque chose?
Vous avez raison, mais l'article est vraiment quelque chose de complètement différent - la réduction de la portée de verrouillage. – gustafc