Eine Race Condition tritt nur auf, wenn zwei Threads gleichzeitig auf dieselbe Ressource zugreifen und ein oder mehrere Threads auf diese Ressource schreiben. Wenn mehrere Threads dieselbe Ressource lesen, tritt keine Racebedingung auf.
Wir können sicher sein, dass von Threads gemeinsam genutzte Objekte threadsicher sind, indem wir das gemeinsam genutzte Objekt unveränderlich machen und von keinem Thread aktualisiert werden. Hier ist ein Beispiel:
public class ImmutableValue{ private int value = 0; public ImmutableValue(int value){ this.value = value; } public int getValue(){ return this.value; } }
Beachten Sie, wie der Wert für die ImmutableValue-Instanz an diesen Konstruktor übergeben wird. Beachten Sie auch, dass es hier keine festgelegte Methode gibt. Sobald diese Instanz erstellt wurde, können Sie ihren Wert nicht mehr ändern. Es ist unveränderlich. Sie können es jedoch mit der get-Methode lesen.
Wenn Sie eine Operation für diese Instanz ausführen müssen, können Sie eine neue Instanz mit dem Wert aus dem Operationsergebnis zurückgeben. Hier ist auch ein Beispiel:
public class ImmutableValue{ private int value = 0; public ImmutableValue(int value){ this.value = value; } public int getValue(){ return this.value; } <strong>public ImmutableValue add(int valueToAdd){ return new ImmutableValue(this.value + valueToAdd); }</strong> }
Beachten Sie, dass die Add-Methode eine neue Instanz mit dem Ergebnis des Add-Vorgangs zurückgibt, anstatt den Wert zu sich selbst hinzuzufügen .
Diese Referenz ist nicht threadsicher
Es ist wichtig, sich dies zu merken, auch wenn ein Da das Objekt unveränderlich und somit Thread-sicher ist, sind Verweise auf dieses Objekt möglicherweise nicht Thread-sicher. Schauen Sie sich dieses Beispiel an:
public class Calculator{ private ImmutableValue currentValue = null; public ImmutableValue getValue(){ return currentValue; } public void setValue(ImmutableValue newValue){ this.currentValue = newValue; } public void add(int newValue){ this.currentValue = this.currentValue.add(newValue); } }
Diese Rechnerklasse enthält einen Verweis auf das obige Objekt. Beachten Sie, dass dieser Verweis möglicherweise durch die setValue-Methode und die add-Methode geändert wird. Selbst wenn diese Klasse intern ein unveränderliches Objekt verwendet, ist sie selbst daher nicht unveränderlich und daher nicht threadsicher. Mit anderen Worten: Diese ImmutableValue-Klasse ist threadsicher, ihre Verwendung jedoch nicht. Dies ist zu beachten, wenn Sie versuchen, Thread-Sicherheit durch Unveränderlichkeit zu erreichen.
Um die Calculator-Klasse threadsicher zu machen, sollten Sie das synchronisierte Schlüsselwort für die Methoden getValue(), setValue() und add() verwenden. Das wird den Zweck erfüllen.
Das Obige ist der Inhalt der Java-Thread-Sicherheit und -Unveränderlichkeit. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!