Ich habe ein Array, das Integer-Werte wie folgt enthält:
%Vor%Jeder Wert muss verarbeitet werden und ich teile die Arbeit in Stücke auf, so dass sie von separaten Threads verarbeitet werden kann. Das Array wird während der Verarbeitung nicht geändert.
Können alle Verarbeitungs-Threads gleichzeitig separate Teile des Arrays lesen? Oder muss ich ein Schloss benutzen?
Mit anderen Worten: Ist dieser Arbeitsauftrag threadsicher?
%Vor%Das Lesen von Inhalten eines Arrays (oder einer anderen Sammlung, Feldern eines Objekts usw.) durch mehrere Threads ist Thread-sicher, vorausgesetzt, die Daten werden zwischenzeitlich nicht geändert.
Wenn Sie das Array mit zu bearbeitenden Daten füllen und es an verschiedene Threads zum Lesen übergeben, werden die Daten korrekt gelesen und es ist kein Datenrennen möglich.
Beachten Sie, dass dies nur funktioniert, wenn Sie die Threads erstellen, nachdem Sie das Array gefüllt haben . Wenn Sie das Array zur Verarbeitung an einige bereits vorhandene Threads ohne Synchronisierung übergeben, wird der Inhalt des Arrays möglicherweise nicht korrekt gelesen. In diesem Fall sollte die Methode, mit der der Thread den Verweis auf das Array erhält, synchronisiert werden, da ein synchronisierter Block eine Speicheraktualisierung zwischen Threads erzwingt.
Nebenbei bemerkt: Eine unveränderbare Sammlung zu verwenden, ist vielleicht eine gute Idee. So stellen Sie sicher, dass keine Änderung möglich ist. Ich würde vorschlagen, solche Wrapper zu verwenden. Überprüfen Sie das java.util.concurrent.atomic
-Paket, es sollte etwas geben, das Sie verwenden können.
Das Lesen vom Array-Array ist Thread-Safe Operation, aber wenn Sie das Array modifizieren, sollten Sie die Klasse AtomicIntegerArray .
Ziehen Sie in Erwägung, eine ConcurrendLinkedQueue zu füllen und jeden Thread ziehen zu lassen davon. Dies würde sicherstellen, dass es keine Nebenläufigkeitsprobleme gibt.
Ihre Threads würden jeweils ihre Daten vom Anfang der Warteschlange abziehen und verarbeiten.
Tags und Links java arrays multithreading