Est String get/set des threads?
Disons que j'ai la suite,
public class Foo{
private String bar;
public String getBar(){
return bar;
}
public void setBar(String bar){
this.bar = bar;
}
}
Ces méthodes sont-elles automatiquement des threads en raison de l'immuable nature de la String
classe, ou un certain mécanisme de verrouillage nécessaire?
Je suppose que tu veux dire
Oui, mon erreur! Fixe.
Connexes c# question: stackoverflow.com/questions/3595114/...
Un objet de type String est un non définitif de référence pour qu'il ne l'est pas. Voir stackoverflow.com/a/6060405/1812922 pour plus de détails
String
dans l'incubateur.Oui, mon erreur! Fixe.
Connexes c# question: stackoverflow.com/questions/3595114/...
Un objet de type String est un non définitif de référence pour qu'il ne l'est pas. Voir stackoverflow.com/a/6060405/1812922 pour plus de détails
OriginalL'auteur mre | 2013-02-25
Vous devez vous connecter pour publier un commentaire.
Non, ce n'est pas thread-safe.
Foo
est mutable, donc si vous voulez vous assurer que les différents fils voir la même valeur debar
– qui est, cohérence – soit:bar
volatile
, ousynchronized
, ouAtomicReference<String>
.Le lit et écrit de
bar
sont eux-mêmes atomique, mais l'atomicité n'est pas la sécurité des threads.http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
Pour une couverture en profondeur, de Java, de simultanéité, de récupérer une copie de Java de la Simultanéité dans la Pratique (aka JCIP).
bar
commefinal
, de sorte que la référence ne peut pas être attribué à une autre valeur. Bien sûr, il n'y aura pas de setter alors 🙂C'est immuable. Pas besoin d'un chien d'arrêt dans cette affaire. Et vous devez vous assurer de fournir un constructeur pour initialiser la valeur, parce que vous ne pouvez pas la changer une fois que vous quittez le constructeur dans ce cas.
... De la curiosité, ne soit de ceux qui ont vraiment de l'importance? Je veux dire, si votre problème est une condition de course, qui peut encore se produire, en dépit de la
volatile
ousynchronized
- il diminue la "fenêtre", dans lequel il peut arriver, non? Ou ai-je raté quelque chose ici?et quelle race condition que ce serait? TBH, ces questions sont pourquoi j'ai éviter de partager des mutable (non-concurrent-bibliothèque) objets dans les threads autant que possible.
Enfiler une mise à jour est
bar
en permanence. Enfiler deux est en attente pourbar
pour lire comme une certaine valeur (la filature avec unwhile(...)
boucle, par exemple). La condition de la course est pour enfiler deux à la lecture de la valeur debar
avant d'enfiler une des mises à jour à nouveau. Si l'une de ces options, et de faire en sorte que tous les fils sont la garantie d'avoir la même référence interne (même si les références sont atomiques peu importe), ce n'est pas grave si ils travaillent sur l'objet à différents temps tranches. Et oui, ce genre de choses c'est pourquoi je préfère des objets immuables.OriginalL'auteur Matt Ball
Vous êtes à la définition de références, et en tant que tel
String
'immutabilité ne vient pas en jeu. Vous n'êtes pas affecter le contenu deString
.OriginalL'auteur Brian Agnew
Non, pas sûr.
C'est Foo mutable comportement; la Chaîne de l'immutabilité ne reviennent pas à Toto.
getBar()
? Peut-être que certains filetage de la fixation d'une nouvelle valeur àbar
, tandis que les autres threads de lecturebar
.Désolé, vous vous êtes fait pas de sens pour moi. Je pense que vos commentaires ne sont que le fait de confondre la question.
un non-synchronisé de lecture avec en parallèle, un poseur de garantir la cohérence dans les threads?
-1 C'est juste étrange.
comme vous l'avez maintenant, la lecture doit être synchronisé pour s'assurer que
bar
'état actuel est visible à tous les threadsOriginalL'auteur duffymo
Non, il n'est pas thread-safe.
Tout
String
est immuable, le problème provient du domaine de laFoo
. Pour rendre cela plus évident, considérons par exemple une méthode dont la tâche serait de ajouter (plutôt que de le remplacer) la valeur debar
. Lorsqu'elle est appelée à partir de plusieurs threads, certaines écrit pourrait être perdu. La même (perte de l'écrit) peut se produire avec votre simple poseur de trop, même si ce n'est pas évident au départ dans ce cas.OriginalL'auteur Theodoros Chatzigiannakis