Sperren auf ein veränderbares Objekt - Warum wird es als eine schlechte Übung betrachtet?

8

Sehen Sie diese Antwort . Es sagt:

  

Sechs wirklich schlechte Beispiele;

     

...

     

sperrt ein veränderbares Feld. z.B. synchronisiert (Objekt) {Objekt = ...; }

Was ist falsch beim Sperren auf einem veränderbaren Feld? Was ist, wenn object als final deklariert wurde, aber keine unveränderliche Klasse war?

    
Murat Derya Özen 08.03.2012, 17:49
quelle

3 Antworten

14

Es ist eine schlechte Idee, denn wenn ein anderer Thread den Verweis im kritischen Abschnitt ändert, sehen die Threads nicht mehr den gleichen Verweis, und deshalb werden sie nicht auf demselben Objekt synchronisiert und laufen somit unkontrolliert ab. Beispiel:

%Vor%

Angenommen, zwei Threads versuchen, in diesen kritischen Abschnitt einzutreten. Thread 1 tritt ein und Thread 2 wartet. Thread 1 geht rein, weist lock1 neu zu und fährt fort. Thread 2 sieht nun eine andere Sperre als Thread 1, die ebenfalls frei ist, also auch in den kritischen Bereich gelangen kann. Spaß ergibt sich!

Wenn das Objekt final ist, können Sie die Referenz nicht einem anderen Objekt zuweisen, so dass das obige Problem nicht länger gilt.

    
Tudor 08.03.2012, 17:52
quelle
5

"Veränderbar" ist hier nicht das richtige Wort. Es ist in Ordnung, ein veränderbares Objekt, d. H. Ein Objekt mit einem Zustand, zu sperren. Was ist falsch ist ein Feld sperren, ändern Sie es, und erwarten, dass ein anderer Thread für das gleiche Objekt sperren.

    
lindelof 08.03.2012 17:53
quelle
1

Ich glaube nicht, dass das Sperren eines veränderlichen Objekts an sich schlecht ist. Es ist nur sehr schwer, es richtig zu machen. Es gibt andere Modelle für die gleichzeitige Verarbeitung, z. B. Schauspieler. Ich schlage vor, dass Sie Akka betrachten, das sowohl von Java als auch von Scala verwendet werden kann und eine sehr solide Implementierung ist.

    
Eduardo 08.03.2012 17:56
quelle