128 votes

Est aléatoire classe thread-safe ?

Il est valable de partager une seule instance de la classe entre plusieurs threads ? Et d’appeler partir de plusieurs threads en particulier ?

73voto

Peter Lawrey Points 229686

Il est thread-safe en ce sens, il va générer des nombres aléatoires lorsqu’il est utilisé par plusieurs threads.

Les utilisations d’implémentation JVM de Sun/Oracle synchronisées et AtomicLong comme semence pour améliorer la cohérence entre les threads. Mais il ne semble pas être garanti sur toutes les plateformes dans la documentation.

Je ne voudrais pas écrire votre programme d’exiger une telle garantie, autant que vous ne pouvez pas déterminer l’ordre dans lequel `` sera appelée.

31voto

iggymoran Points 930

Il est en sécurité, bien que ce ne soit pas toujours le cas.

Voir http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6362070 pour plus de détails.

9voto

MarvinLabs Points 13401

Selon la documentation, Math.random () garantit l’utilisation sans danger de plusieurs threads. Mais la classe aléatoire ne le fait pas. Je suppose que vous devrez alors synchroniser vous-même.

7voto

Buhake Sindi Points 38654

Oui, Random est thread-safe. la méthode nextInt() appelle la méthode protégée next(int) qui utilise AtomicLong seed, nextseed (longueur atomique) pour générer une graine suivante. AtomicLong est utilisé pour la sécurité du filetage lors de la génération des semences.

4voto

alpian Points 3002

Il n'y a pas de raison de plusieurs threads ne peuvent pas tous utiliser le même Aléatoire. Cependant, depuis la classe n'est pas explicitement thread-safe et maintient une séquence de nombres pseudo-aléatoires par la graine. Plusieurs threads peuvent se retrouver avec le même nombre aléatoire. Il serait préférable de créer plusieurs Randoms pour chaque thread et de graines différemment.

EDIT: je viens de remarqué que le Soleil de la mise en œuvre utilise AtomicLong donc je suppose que c'est Thread-safe (comme le fait remarquer Peter Lawrey (+1)).

EDIT2: OpenJDK utilise également AtomicLong pour la postérité. Comme d'autres l'ont dit bien que c'est toujours pas bon de s'appuyer sur cette.

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