Контекст: высокопоточное приложение на стороне сервера с множеством операций чтения, периодической записи.
Рассмотрим следующий простой код:
[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: Если приведенное выше решение не подходит, что будетВы рекомендуете?