Чтение / запись ссылочного типизированного поля несколькими потоками БЕЗ блокировки - PullRequest
1 голос
/ 21 июня 2010

Контекст: высокопоточное приложение на стороне сервера с множеством операций чтения, периодической записи.

Рассмотрим следующий простой код:

[Serializable]
public class BusinessObject
{
    // ... lot's of stuff, all READ ONLY!!!
}

public class BusinessObjectHost
{
    private BusinessObject bo;
    public BusinessObject BO
    {
       get { return this.bo; }
       set { this.bo = value; }
    }

}

Предполагаемое использование следующее: BusinessObjectнеизменен.Если я иногда хочу изменить его, мне просто нужно заменить поле BusinessObjectHost.bo новым экземпляром.

Q1: Что произойдет, если я не применю какую-либо блокировку в свойстве BusinessObjectHost.BO и возникнет конфликт потоков между чтением и записью в поле BusinessObjectHost.bo?Будет ли поток выбрасывать исключения?Если да, то какой?

Q2: Если сбой потока вызывает исключение, сработает ли следующий код?

public class BusinessObjectHost
{
    private BusinessObject bo;
    public BusinessObject BO
    {
       get 
       { 
           int i = 5; // Max 5 tries
           while (i-- > 0)
           {
              try { return this.bo; }
              catch (WhateverThreadConflictException) {}
           }
           throw new MyException(); 
       }
       set 
       { 
           int i = 5; // Max 5 tries
           while (i-- > 0)
           {
              try { this.bo = value; return; }
              catch (WhateverThreadConflictException) {}
           }
           throw new MyException(); 
       }
    }

}

Q3: Если приведенное выше решение не подходит, что будетВы рекомендуете?

Ответы [ 2 ]

3 голосов
/ 21 июня 2010

Ваш BusinessObjectHost содержит только ссылку. Ссылки являются атомарными, поэтому вы не получите исключения с простым кодом в snippet1.

Использование может быть приемлемым, в зависимости от того, что вы хотите, чтобы произошло. Когда два или более потоков теперь читают свойство BO, они могут получить ссылки на разные экземпляры. Но вы все равно не можете предотвратить это из кода свойства BO.

Q2, Q3: код в snippet2 ничего не решает.

0 голосов
/ 21 июня 2010

Я полагаю, что .NET предлагает класс для этой конкретной цели.

ReaderWriterLock Class : http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...