52 votes

Pourquoi une variable membre d'un objet ne peut-elle pas être à la fois finale et volatile en Java ?

Si dans une classe j'ai une instance ConcurrentHashMap qui sera modifiée et lue par plusieurs threads, je pourrais définir comme ceci :

 public class My Class {

    private volatile ConcurrentHashMap<String,String> myMap = new ConcurrentHashMap<String,String>();
...
}

l'ajout de final au champ myMap entraîne une erreur indiquant que je ne peux utiliser que final ou volatile. Pourquoi ne peut-il pas être les deux ?

45voto

Michael Borgwardt Points 181658

volatile ne concerne que les modifications de la variable elle-même, pas l'objet auquel elle se réfère. Cela n'a aucun sens d'avoir un final volatile car les champs finaux ne peuvent pas être modifiés. Déclarez simplement le champ final et ça devrait aller.

9voto

Sunil Kumar B M Points 1441

Parce que volatile et final sont deux extrémités extrêmes en Java

volatile signifie que la variable est liée aux changements

final signifie que la valeur de la variable ne changera jamais du tout

4voto

MByD Points 78505

volatile est utilisé pour les variables dont la valeur peut changer, dans certains cas, sinon il n'y a pas besoin de volatile , et final signifie que la variable ne peut pas changer , il n'y a donc pas besoin de volatile .

Vos problèmes de concurrence sont importants, mais rendre le HashMap volatile ne résoudra pas le problème, pour gérer les problèmes de concurrence, vous utilisez déjà ConcurrentHashMap .

3voto

AlexR Points 60796

volatile garantit que toutes les lectures et écritures vont directement dans la mémoire principale, c'est-à-dire que l'accès aux variables est presque dans le bloc synchronized Ceci n'est pas pertinent pour la variable finale qui ne peut pas être modifiée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X