Sind gleichzeitige Lesevorgänge von einem Array Thread-sicher?

8

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%     
user2342875 15.08.2013, 16:44
quelle

6 Antworten

6

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.

    
Dariusz 15.08.2013, 16:47
quelle
2

Solange die Threads den Inhalt des Arrays nicht ändern, ist es in Ordnung, das Array aus mehreren Threads zu lesen.

    
Vikdor 15.08.2013 16:48
quelle
0

Wenn Sie sicherstellen, dass alle Threads nur lesen, ist der Thread sicher. Obwohl Sie sich nicht auf diese Tatsache verlassen sollten alone und versuchen, Ihr Array über einen Wrapper unveränderlich zu machen.

    
rocketboy 15.08.2013 16:48
quelle
0

Sicher, wenn Sie es nur lesen möchten, übergeben Sie das Array an die Threads, wenn Sie sie erstellen. Es wird kein Problem geben, solange Sie nicht ändern .

    
Luis Sep 15.08.2013 16:49
quelle
0

Das Lesen vom Array-Array ist Thread-Safe Operation, aber wenn Sie das Array modifizieren, sollten Sie die Klasse AtomicIntegerArray .

    
Ankur Lathi 15.08.2013 16:52
quelle
0

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.

    
Surveon 15.08.2013 16:56
quelle

Tags und Links