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?
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.
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.
Tags und Links java multithreading thread-safety concurrency synchronized