Was ist das Golang-Äquivalent eines Java-synchronisierten () Blocks?

7

Java bietet ein sehr praktisches Idiom zum Synchronisieren kritischer Codeabschnitte:

%Vor%

Oder

%Vor%

Was ist das Äquivalent?

(Eine schnelle Suche zeigt: golang.org/pkg/sync/ - was scheint (vielleicht irre ich mich) ein bisschen zu niedrig für den allgemeinen Gebrauch.)

(Beispiel dafür, warum mir das wichtig ist: Ich muss eine Nachricht an mehrere Listener über Kanäle senden. Kanäle bieten einen guten Kanal für die Daten, ohne etwas synchronisieren zu müssen, aber wenn Kanäle hinzugefügt oder entfernt werden, muss ich die ändern Liste von Kanälen, die zu jeder Zeit auftreten können, müssen in der Lage sein, mit Nebenläufigkeit umzugehen.)

    
Brad Peabody 18.09.2013, 19:20
quelle

3 Antworten

8

sync.Mutex ist eine gegenseitige Ausschlusssperre, sie kann eine ähnliche Funktionalität wie der Schlüssel synchronized java bereitstellen -word (außer dass Sperren in Java den gegenseitigen Ausschluss von reentrant bereitstellen):

%Vor%

Entspricht:

%Vor%     
tarrsalah 18.09.2013 19:39
quelle
6

Eine andere Lösung für die Verwendung eines Mutex ist die Verwendung eines Kanals zur Kommunikation von Listener-Änderungen.

Ein vollständiges Beispiel in diesem Stil sieht so aus. Der interessante Code ist in FanOuter.

%Vor%     
Paul Hankin 19.09.2013 14:11
quelle
5

um die Antwort von Tarrsalah zu verlängern.

Sie können sync.Mutex zu Ihrem Objekt hinzufügen, so dass sie direkt gesperrt und entsperrt werden können.

%Vor%

Defer'd-Befehle werden am Ende der Funktion ausgeführt, so dass Sie wissen, dass sie in größeren Funktionen gesperrt und entsperrt wird.

    
Ryan Carrier 01.01.2016 09:44
quelle

Tags und Links