Die Kernalgorithmen sind im Wesentlichen die gleichen. Der ThreadLocalRandom verwendet das Java ThreadLocal-Konstrukt, um eine neue zufällige Variable für jeden Thread zu erstellen. Dies garantiert, dass die Aufrufe von jedem Thread niemals mit jedem Konflikt kollidieren (keine Konkurrenz).
Werfen Sie einen Blick auf diese Linie Zufälliges zum Vergleich:
} while (!seed.compareAndSet(oldseed, nextseed));
Wenn Sie für einen nächsten Wert fragen, Zufall nimmt den alten Wert und erzeugt einen neuen Wert. Es verwendet dann die AtomicLong.compareAndSet-Funktion, um den neuen Wert nur dann festzulegen, wenn der alte Wert immer noch der alte Wert ist. Wenn ein anderer Thread den Wert geändert hat, wird die Schleife erneut ausgeführt (und wieder, bis sie die einzige Schleife ist, die den Wert in einer Zufallszahlengenerierung abruft und setzt). Somit sind mögliche Konflikte und somit mögliche Auswirkungen auf die Leistung möglich.
Der ThreadLocalRandom benötigt keine atomaren Funktionen und thread-sicheren Operationen/Sperren, da garantiert kein Konflikt entsteht.
Es gibt einige Kompromisse, über die Sie nachdenken sollten. Die Verwendung von einem Zufallsgenerator ermöglicht einen Zufallszahlengenerator, der sehr nützlich ist, wenn Sie einen einzelnen Startwert für Ihre Anwendung verwenden möchten. Wenn Sie gelegentlich nur Random aufrufen, sodass Konflikte wahrscheinlich "selten" sind (nicht der Normalfall), müssen Sie sich keine Gedanken über Konflikte machen, und die kleinen individuellen Auswirkungen auf die Leistung spielen keine Rolle. Wenn Sie Hunderte von Sekunden pro Sekunde über mehrere Threads hinweg aufrufen, möchten Sie ThreadLocalRandom eindeutig verwenden.
Wenn ich in jedem Thread eine neue Instanz von java.util.Random erstelle, führt das nicht zum selben Effekt wie die Verwendung von ThreadLocalRandom in jedem Thread? Oder verwenden alle Instanzen von java.util.Random den gleichen Seed? – Peter
Ein Teil des Problems mit 'Random' ist, dass es unnötigerweise" synchronisiert "ist; selbst wenn Sie einen pro-Thread erstellen, ist dieser nicht so performant wie 'ThreadLocalRandom'. – dimo414