2009-10-15 7 views
23

Ma question se rapporte à la question de savoir si l'utilisation d'un ReentrantLock garantit la visibilité d'un champ au même titre que le mot clé synchronized.Le mot clé volatile est-il requis pour les champs accessibles via un ReentrantLock?

Par exemple, dans la classe suivante A, le champ shareddata n'a pas besoin d'être déclarée volatile comme le mot-clé synchronisé est utilisé. Pour l'exemple suivant utilisant un ReentrantLock, le mot-clé volatil est-il nécessaire dans le champ?

class B 
{ 
    private final ReentrantLock lock = new ReentrantLock(); 
    private volatile double sharedData; 

    public void method() 
    { 
    lock.lock(); 
    try 
    { 
     double temp = sharedData; 
     temp *= 2.5; 
     sharedData = temp + 1; 
    } 
    finally 
    { 
     lock.unlock(); 
    } 
    } 
} 

Je sais que l'utilisation du mot-clé volatile imposera de toute façon que probablement un coup de performance miniscule, mais je voudrais encore coder correctement.

Répondre

28

C'est sûr sans volatilité. ReentrantLock implémente Lock et le docs for Lock comprennent ceci:

Toutes les Lock mises en œuvre doivent appliquer la même synchronisation sémantique tel que prévu par le verrouillage du moniteur intégré mémoire, comme décrit dans Java Language Specification, troisième édition (17,4 modèle de mémoire):

  • Une opération réussie lock a les mêmes effets de synchronisation de mémoire une action réussie Lock.
  • Une opération réussie unlock a les mêmes effets mémoire de synchronisation en tant que succès l'action Unlock.
+0

Ce conseil est-il vrai en ce qui concerne 'while (field)' en raison du levage sur le terrain? – Pod

+0

@Pod: Sans plus de détails sur la façon dont la boucle while interagit avec le verrou, c'est impossible à dire. Vous voulez probablement créer une nouvelle question avec un exemple spécifique. –