Schreibzugriff auf flüchtiges Feld synchronisieren (günstiger Lese- / Schreibblock)

7

Sagen wir, ich habe die folgende Klasse, die schwer gelesen wird, aber nur gelegentlich geschrieben wird. Es wird in einer Multithread-Web-App verwendet, daher muss es Thread-sicher sein:

%Vor%

Java Concurrency ( Ссылка ) gibt an, dass dies ein fragiler Weg ist Schreibzugriff schützen und den Lesezugriff verbessern. Was ist eine stärkere Alternative zu diesem Muster? Oder irgendeine Alternative, wenn foo in einer lese-schweren Umgebung veränderbar sein soll? Danke.

    
oberger 05.03.2013, 01:36
quelle

3 Antworten

14

Volatile bietet schnellen Thread-sicheren, blockierungsfreien Zugriff auf ein Feld ohne Synchronisation

%Vor%

volatile löst 3 Probleme 1) Speichersichtbarkeit 2) atomare Schreibvorgänge für doppelte und lange Felder 3) verbietet Instruktionen. Aber es ist nicht genug, wenn Sie mehrere Operationen über ein Feld als eine atomare Transaktion benötigen, wie zum Beispiel Inkrement. Dieser Code ist beschädigt.

%Vor%

weil wenn zwei Threads gleichzeitig lesen und inkrementieren und das Ergebnis speichern, dann wird das Ergebnis des ersten Inkrements mit dem Ergebnis des zweiten Inkrements überschrieben. Um dies zu verhindern, müssen wir die Synchronisation verwenden

%Vor%

oder java.util.concurrent.atomic Paket

%Vor%     
Evgeniy Dorofeev 05.03.2013, 01:43
quelle
2

Wenn Sie nur foo setzen, müssen Sie die Methode nicht synchronisieren. die Angabe der Volatilität ist ausreichend.

    
jtahlborn 05.03.2013 01:44
quelle
2

Im Link haben Sie gesagt, dass es diesen Code für " seltene Updates "Verwendung:

%Vor%

Die increment -Methode verwendet nur synchronisiert, da sie mehr tut als nur den Wert von value wie in der Beschreibung angegeben zu setzen, wenn Sie nur this.foo = in; tun, das atomar ist. Im Text bedeutet die "Zerbrechlichkeit dieses Musters", dass Dinge sehr schnell unordentlich werden können, wenn man flüchtige und andere Synchronisationsmethoden kombiniert, um mehr als nur einfache Beispiele zu machen. Siehe Paket java.util.concurrent.locks für die Schnittstellen Bedingung und Sperre und die Klasse ReentrantLock . Ich denke das, und das Verwenden von synchronisiert ist, was der Autor durch "stärkere Alternativen" meint. Sie sollten auch Object.wait , Object.notify und Object.notifyAll sehen, wenn Sie das noch nicht wissen.

    
Francisco M. 05.03.2013 09:53
quelle