Hat c # eine eigene Version des Java-Schlüsselworts "synchronized"?
Dh in Java kann es entweder für eine Funktion, ein Objekt oder einen Codeblock angegeben werden, wie folgt:
public synchronized void doImportantStuff() {
// dangerous code goes here.
}
oder
public void doImportantStuff() {
// trivial stuff
synchronized(someLock) {
// dangerous code goes here.
}
}
[MethodImpl(MethodImplOptions.Synchronized)]
Zeile erinnern kann .Antworten:
Erstens: Die meisten Klassen müssen niemals threadsicher sein. Verwenden Sie YAGNI : Wenden Sie Thread-Sicherheit nur an, wenn Sie wissen, dass Sie es tatsächlich verwenden werden (und testen Sie es).
Für die Sachen auf Methodenebene gibt es
[MethodImpl]
:Dies kann auch für Accessoren (Eigenschaften und Ereignisse) verwendet werden:
Beachten Sie, dass feldartige Ereignisse werden standardmäßig synchronisiert, während automatisch implementierte Eigenschaften sind nicht :
Persönlich mag ich die Implementierung nicht,
MethodImpl
da sie sperrtthis
odertypeof(Foo)
- was gegen Best Practice verstößt. Die bevorzugte Option ist die Verwendung eigener Schlösser:Beachten Sie, dass bei feldähnlichen Ereignissen die Sperrimplementierung vom Compiler abhängt. In älteren Microsoft-Compilern ist es ein
lock(this)
/lock(Type)
- in neueren Compilern werden jedochInterlocked
Updates verwendet - also threadsicher ohne die unangenehmen Teile.Dies ermöglicht eine detailliertere Verwendung und die Verwendung von
Monitor.Wait
/Monitor.Pulse
etc für die Kommunikation zwischen Threads.Ein verwandter Blogeintrag (später überarbeitet ).
quelle
MethodImpl
und feldähnliche Ereignisse jetzt einen guten Synchronisationscode generieren und es nicht mehr erforderlich ist, eigene Sperren zu verwenden.quelle
Nein. In C # geben Sie explizit
lock
Ressourcen an, an denen Sie synchron über asynchrone Threads arbeiten möchten.lock
öffnet einen Block; es funktioniert nicht auf Methodenebene.Allerdings ist der zugrunde liegende Mechanismus , da ähnliche
lock
Arbeiten durch den AufrufMonitor.Enter
(und späterMonitor.Exit
) auf der Laufzeit. Java funktioniert laut Sun-Dokumentation genauso .quelle
synchronized
On-Methode von Java im Grunde genommensynchronized (this.getClass())
nicht ähnlich zu C # istlock(typeof(this))
?synchronized
Schlüsselwort von Java für eine Methode ist eher wie:synchronized(this)
Nur für eine statische Methode verhält es sich sosynchronized(class)
.Beachten Sie, dass bei vollen Pfaden die Linie
[MethodImpl(MethodImplOptions.Synchronized)]
wie folgt aussehen sollte[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
quelle
using System.Runtime.CompilerServices;
Sie können
lock
stattdessen die Anweisung verwenden. Ich denke, dies kann nur die zweite Version ersetzen. Denken Sie auch daran, dass beidesynchronized
undlock
ein Objekt bearbeiten müssen.quelle