Il est valable de partager une seule instance de la classe entre plusieurs threads ? Et d’appeler
partir de plusieurs threads en particulier ?
Réponses
Trop de publicités?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.
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.
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.
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.
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.