Datensynchronisierung für MultithreadingSynchronizing data for multithreading

Wenn mehrere Threads die Eigenschaften und Methoden eines einzelnen Objekts aufrufen können, ist es wichtig, dass diese Aufrufe synchronisiert werden.When multiple threads can make calls to the properties and methods of a single object, it is critical that those calls be synchronized. Andernfalls kann ein Thread möglicherweise die Aufgabe eines anderen Threads unterbrechen, und das Objekt bleibt womöglich in einem ungültigen Status zurück.Otherwise one thread might interrupt what another thread is doing, and the object could be left in an invalid state. Eine Klasse, deren Mitglieder vor solchen Unterbrechungen geschützt, wird threadsicher genannt.A class whose members are protected from such interruptions is called thread-safe.

.NET stellt verschiedene Strategien zum Synchronisieren des Zugriffs auf Instanzmember und statische Member bereit:.NET provides several strategies to synchronize access to instance and static members:

  • Synchronisierte Codebereiche.Synchronized code regions. Sie können die Monitor-Klasse oder die Compilerunterstützung für diese Klasse zum Synchronisieren von einzig und allein dem Codeblock verwenden, der sie benötigt, wobei die Leistung verbessert wird.You can use the Monitor class or compiler support for this class to synchronize only the code block that needs it, improving performance.

  • Manuelle SynchronisierungManual synchronization. Sie können die von der .NET-Klassenbibliothek bereitgestellten Synchronisierungsobjekte verwenden.You can use the synchronization objects provided by the .NET class library. Unter Übersicht über Synchronisierungsprimitiven finden Sie weitere Informationen, darunter eine Beschreibung der Monitor-Klasse.See Overview of Synchronization Primitives, which includes a discussion of the Monitor class.

  • Synchronisierte Kontexte.Synchronized contexts. Für .NET Framework- und Xamarin-Anwendungen können Sie SynchronizationAttribute verwenden, um eine einfache automatische Synchronisierung für ContextBoundObject-Objekte zu ermöglichen.For .NET Framework and Xamarin applications, you can use the SynchronizationAttribute to enable simple, automatic synchronization for ContextBoundObject objects.

  • Auflistungsklassen im System.Collections.Concurrent-Namespace.Collection classes in the System.Collections.Concurrent namespace. Diese Klassen stellen integrierte synchronisierte Hinzufüge- und Entfernungsvorgänge bereit.These classes provide built-in synchronized add and remove operations. Weitere Informationen finden Sie unter Threadsichere Auflistungen.For more information, see Thread-Safe Collections.

Die Common Language Runtime stellt ein Threadmodell bereit, bei dem Klassen in verschiedene Kategorien fallen, die je nach den Anforderungen in einer Vielzahl von Möglichkeiten synchronisiert werden können.The common language runtime provides a thread model in which classes fall into a number of categories that can be synchronized in a variety of different ways depending on the requirements. Die folgende Tabelle zeigt, welche Synchronisierungsunterstützung für Felder und Methoden mit einer angegebenen Synchronisierungskategorie vorhanden sind.The following table shows what synchronization support is provided for fields and methods with a given synchronization category.

KategorieCategory Globale FelderGlobal fields Statische FelderStatic fields Statische MethodenStatic methods InstanzfelderInstance fields InstanzmethodenInstance methods Spezifische CodeblöckeSpecific code blocks
Keine SynchronisierungNo Synchronization NeinNo NeinNo NeinNo NeinNo NeinNo NeinNo
Synchronisierter KontexteSynchronized Context NeinNo NeinNo NeinNo JaYes JaYes NeinNo
Synchronisierte CodebereicheSynchronized Code Regions NeinNo NeinNo Nur wenn markiertOnly if marked NeinNo Nur wenn markiertOnly if marked Nur wenn markiertOnly if marked
Manuelle SynchronisierungManual Synchronization ManuellManual ManuellManual ManuellManual ManuellManual ManuellManual ManuellManual

Keine SynchronisierungNo synchronization

Dies ist die Standardeinstellung für Objekte.This is the default for objects. Jeder Thread kann jederzeit auf alle Methoden oder Felder zugreifen.Any thread can access any method or field at any time. Es sollte jedoch nur ein Thread nach dem anderen auf diese Objekte zugreifen.Only one thread at a time should access these objects.

Manuelle SynchronisierungManual synchronization

Die .NET-Klassenbibliothek stellt eine Reihe von Klassen zum Synchronisieren von Threads bereit.The .NET class library provides a number of classes for synchronizing threads. Weitere Informationen finden Sie unter Übersicht über Synchronisierungsprimitiven.See Overview of Synchronization Primitives.

Synchronisierte CodebereicheSynchronized code regions

Sie können die Monitor-Klasse oder ein Compilerschlüsselwort zur Synchronisierung von Codeblöcken, Instanzmethoden und statischen Methoden verwenden.You can use the Monitor class or a compiler keyword to synchronize blocks of code, instance methods, and static methods. Es gibt keine Unterstützung für synchronisierte statische Felder.There is no support for synchronized static fields.

Visual Basic und C# unterstützen das Markieren von Codeblöcken mit einem bestimmten Sprachschlüsselwort, der lock-Anweisung in C# oder der SyncLock-Anweisung in Visual Basic.Both Visual Basic and C# support the marking of blocks of code with a particular language keyword, the lock statement in C# or the SyncLock statement in Visual Basic. Wenn der Code von einem Thread ausgeführt wird, wird versucht, die Sperre abzurufen.When the code is executed by a thread, an attempt is made to acquire the lock. Wenn die Sperre bereits von einem anderen Thread abgerufen wurde, wird der Thread blockiert, bis die Sperre verfügbar ist.If the lock has already been acquired by another thread, the thread blocks until the lock becomes available. Wenn der Thread den synchronisierten Codeblock beendet, wird die Sperre aufgehoben, unabhängig davon, wie der Thread den Block beendet.When the thread exits the synchronized block of code, the lock is released, no matter how the thread exits the block.

Hinweis

Die lock- und SyncLock-Anweisung werden mit Monitor.Enter und Monitor.Exitimplementiert, sodass andere Methoden von Monitor in Verbindung mit ihnen im synchronisierten Bereich verwendet werden können.The lock and SyncLock statements are implemented using Monitor.Enter and Monitor.Exit, so other methods of Monitor can be used in conjunction with them within the synchronized region.

Sie können eine Methode auch mit einem MethodImplAttribute-Element mit dem Wert MethodImplOptions.Synchronized versehen. Dies hat die gleiche Auswirkung wie die Verwendung von Monitor oder von einem der Compilerschlüsselwörter zum Sperren des gesamten Texts der Methode.You can also decorate a method with a MethodImplAttribute with a value of MethodImplOptions.Synchronized, which has the same effect as using Monitor or one of the compiler keywords to lock the entire body of the method.

Thread.Interrupt kann verwendet werden, um einen Thread aus blockierten Vorgängen zu unterbrechen, wie z.B. das Warten auf Zugriff auf einen synchronisierten Codebereich.Thread.Interrupt can be used to break a thread out of blocking operations such as waiting for access to a synchronized region of code. Thread.Interrupt dient außerdem zum Unterbrechen von Threads von Vorgängen wie Thread.Sleep aus.Thread.Interrupt is also used to break threads out of operations like Thread.Sleep.

Wichtig

Sperren Sie nicht den Typ – d.h. typeof(MyType) in C#, GetType(MyType) in Visual Basic oder MyType::typeid in C++ – um die static-Methoden zu schützen (Shared-Methoden in Visual Basic).Do not lock the type — that is, typeof(MyType) in C#, GetType(MyType) in Visual Basic, or MyType::typeid in C++ — in order to protect static methods (Shared methods in Visual Basic). Verwenden Sie stattdessen ein privates statisches Objekt.Use a private static object instead. Verwenden Sie auch nicht this in C# (Me in Visual Basic), um Instanzmethoden zu sperren.Similarly, do not use this in C# (Me in Visual Basic) to lock instance methods. Verwenden Sie stattdessen ein privates Objekt.Use a private object instead. Eine Klasse oder Instanz kann von einem anderen Code als Ihrem eigenen gesperrt werden, was potenziell zu Deadlocks oder Leistungsproblemen führt.A class or instance can be locked by code other than your own, potentially causing deadlocks or performance problems.

CompilerunterstützungCompiler support

Visual Basic und C# unterstützen ein Sprachschlüsselwort, das Monitor.Enter und Monitor.Exit zum Sperren des Objekts verwendet.Both Visual Basic and C# support a language keyword that uses Monitor.Enter and Monitor.Exit to lock the object. Visual Basic unterstützt die SyncLock-Anweisung und C# unterstützt die lock-Anweisung.Visual Basic supports the SyncLock statement; C# supports the lock statement.

Wenn eine Ausnahme im Codeblock ausgelöst wird, wird in beiden Fällen die Sperre, die durch lock oder SyncLock erstellt wurde, automatisch aufgehoben.In both cases, if an exception is thrown in the code block, the lock acquired by the lock or SyncLock is released automatically. Die C#- und Visual Basic-Compiler geben einen try/finally-Block mit Monitor.Enter zu Beginn des Versuchs und Monitor.Exit im finally-Block aus.The C# and Visual Basic compilers emit a try/finally block with Monitor.Enter at the beginning of the try, and Monitor.Exit in the finally block. Wenn eine Ausnahme innerhalb eines lock- oder SyncLock-Blocks ausgelöst wird, wird der finally-Handler ausgeführt, damit Sie notwendige Bereinigungen ausführen können.If an exception is thrown inside the lock or SyncLock block, the finally handler runs to allow you to do any clean-up work.

Synchronisierter KontexteSynchronized Context

Ausschließlich in .NET Framework- und Xamarin-Anwendungen können Sie das SynchronizationAttribute-Element für beliebige ContextBoundObject-Elemente verwenden, um alle Instanzmethoden und -felder zu synchronisieren.In .NET Framework and Xamarin applications only, you can use the SynchronizationAttribute on any ContextBoundObject to synchronize all instance methods and fields. Alle Objekte in der gleichen Kontextdomäne teilen die gleiche Sperre.All objects in the same context domain share the same lock. Mehrere Threads können auf die Methoden und Felder zugreifen, jedoch ist nur ein einzelner Thread gleichzeitig zulässig.Multiple threads are allowed to access the methods and fields, but only a single thread is allowed at any one time.

Weitere InformationenSee also