Как в .net работает атрибут [Synchronization] в связке с ContextBoundObject?
Я прочитал документацию по:
- ContextBoundObject
- SynchronizationAttribute.
- А также обзорную по синхронизации
но из прочитанного не понимаю, как этим пользоваться. В частности, вот тут:
you can use the SynchronizationAttribute on any ContextBoundObject to synchronize all instance methods and fields. All objects in the same context domain share the same lock
не ясно, что значит in the same context domain. Как объект ассоциировать с context domain, откуда эти домены берутся - непонятно.
Или вот эта часть документации:
A new object is placed into an existing context or into a new context created using the attributes included in the metadata of the type
Тут не ясно, в каком случае все таки будет создан новый контекст. Я интерпретирую эту часть документации так, что SynchronizationAttribute - это один из примеров тех метаданных, которые определяют правила, когда будет создан новый контекст, но какие эти правила для [Synchronization] не вполне понятно, документация по нему для меня туманна:
When this attribute is applied to an object, only one thread can be executing in all contexts that share an instance of this property. This is done by contributing sinks that intercept and serialize incoming calls for the respective contexts
Что здесь значит in all contexts that share an instance of this property?
Пример кода:
[Synchronization]
public class A: ContextBoundObject
{
public void f() {
}
}
Если я создам разные экземпляры класса A, будет ли у каждого свой context domain (и соответственно можно будет вызывать f параллельно для разных экземпляров)? Или в этом случае будет создан один context domain для всего класса?
Ответы (1 шт):
Атрибут Synchronization в .NET работает в сочетании с ContextBoundObject, чтобы гарантировать, что все операции, выполняемые над объектом, выполняются синхронно, а это означает, что несколько потоков могут безопасно обращаться к одному и тому же объекту, не попадая в условия гонки. Это делается путем получения блокировки объекта каждый раз, когда к нему обращается поток, и снятия блокировки только тогда, когда поток завершает работу с объектом. Это гарантирует, что только один поток может получить доступ к объекту в любой момент времени и что любые изменения, сделанные одним потоком, видны всем другим потокам.