java synchronisierter Block für mehr als 1 Objekte?

8

Ich habe zwei Arrays, und ich muss den Zugriff auf sie über Threads synchronisieren. Ich werde sie in einen synchronisierten Block stellen. Das Problem ist, ich kann nur einen von ihnen auf "synchronisiert" gehen.

Wie stelle ich sicher, dass der Zugriff auf beide Arrays synchronisiert ist? Bringe ich sie in eine Klasse und schaffe ein Objekt davon? Oder ich greife auf das andere Array nur im synchronisierten Block zu, und dies sorgt für einen synchronisierten Zugriff darauf?

Danke,

    
Chaitanya 05.12.2009, 08:11
quelle

2 Antworten

20

Was auch immer Sie tun nicht tun dies:

%Vor%

Dies wird wahrscheinlich zu Deadlock führen, wenn Sie nicht sehr vorsichtig sind. Wenn Sie diesen Ansatz verfolgen, müssen Sie sicherstellen, dass Sie eine unveränderliche Teilaufgabe für die Objekte haben - Google "Dining Philosophers" zur Diskussion der Fallstricke.

Grundsätzlich müssen Sie ein Sperrobjekt erstellen, das Sie verwenden möchten, wenn Sie auf entweder -Array zugreifen und dieses dann für alle -Arrayzugriffe verwenden möchten. Es ist grobkörnig, aber sicher. Du könntest es so machen:

%Vor%

Wenn Sie eine feinkörnigere Methode benötigen, verwenden Sie die Java 5+-Begleitprogramme wie ReadWriteLock aber dies wird komplizierter zu implementieren und fehleranfällig.

    
cletus 05.12.2009 08:15
quelle
11

Vor Java 5 hätte ich Folgendes geschrieben:

%Vor%

Aber seit Java 5 würde ich Klassen von java.util.concurrent.locks (persönlich finde ich das nicht komplizierter oder fehleranfällig):

%Vor%

Wenn Sie eine Lese-Schreib-Sperre benötigen, wird hier ein Beispiel mit Lese-Schreib-Sperren aus Java 5 implementiert:

%Vor%

Passen Sie es natürlich Ihren Bedürfnissen an.

    
Pascal Thivent 05.12.2009 13:36
quelle