2017-06-09 4 views
2

Je voudrais savoir si cet appel est thread-safe. Par exemple, si je s un ensemble:Le thread gava ImmutableSet.copyOf() est-il sûr?

Set<String> s = new HashSet<>(); 

et deux fils A et B, enfiler une modification de l'ensemble:

for (int i = 0; i < 1234; i++) { 
    // add, remove from s 
} 

tandis que le thread B créant ImmutableSets de s:

for (int i = 0; i < 5678; i++) { 
    Set<String> newS = ImmutableSet.copyOf(s); 
} 

Est-il sûr de supposer que chaque fois que ImmutableSet.copyOf() est appelé, j'obtiens un ensemble immuable pour un état valide de s dans le temps? Y aura-t-il une sorte d'exception (comme ConcurrentModificationException) qui peut se produire?

Si le filetage est sûr, comment a-t-il été réalisé sans verrouiller l'ensemble?

Répondre

6

La question pertinente est pas si copyOf est sûr - il est si la collection qu'elle copie de est sûr, et en particulier, si les itérateurs qu'il crée via sa méthode iterator() sont thread-safe. Pour HashMap, cette réponse est non.

4

HashSet n'est pas sécurisé pour les threads. ImmutableSet.copyOf doit parcourir sur votre HashSet, ce qui n'est pas sûr si un autre thread le modifie simultanément. De plus, avoir deux threads modifiant le HashSet est déjà dangereux.

+0

J'ai une question [ici] (https://stackoverflow.com/questions/46900147/send-record-and-wait-for-its-acknowledgement-to-receive) dans laquelle j'utilise la goyave et je suis Je ne sais pas si ces opérations fonctionnent correctement ou non, donc je voulais savoir si vous pouviez m'aider. – john

+0

HashSet n'est PAS thread-safe même si personne ne le modifie en même temps. L'accès HashSet doit toujours être synchronisé. – 30thh