Являются ли свойства уровня класса или переменные потокобезопасными - PullRequest
1 голос
/ 25 ноября 2010

У меня всегда был этот специфический сценарий, который волновал меня целую вечность.Допустим, мой класс выглядит следующим образом

public class Person {
public Address Address{get;set;}
public string someMethod()
{}
}

Мой вопрос состоит в том, что мои коллеги-разработчики сказали мне, что свойство Address типа Address не является потокобезопасным.

Из веб-запросаВ перспективе каждый запрос выполняется в отдельном потоке, и каждый раз, когда поток обрабатывает следующую строку в моем бизнес-объекте или коде, например

var p = new Person();

, он создает новый экземпляр объекта Person в куче, и поэтомуДоступ к экземпляру обращается к запрашивающему потоку, если только в моем приложении не появилось несколько потоков.

Если я ошибаюсь, пожалуйста, объясните мне, почему я не прав и почему публичное свойство (Address) не является потокобезопасным?

Любая помощь будет высоко ценится.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 ноября 2010

Если ссылка на ваш экземпляр Person является общей для нескольких потоков, то несколько потоков могут потенциально изменить Address, вызывая состояние гонки.Однако, если вы не держите эту ссылку в статическом поле или в Session (своего рода глобально доступном месте), вам не о чем беспокоиться.

Если вы создаете ссылки на объекты в своем кодекак показано выше (var p = new Person();), тогда вы совершенно безопасны для потоков, так как другие потоки не смогут получить доступ к ссылкам на эти объекты, не прибегая к неприятным и злым уловкам.

1 голос
/ 25 ноября 2010

Ваше свойство не является поточно-ориентированным, поскольку у вас нет блокировки, чтобы предотвратить множественные записи в свойство, наступающие на пальцы друг друга.

Однако в вашем сценарии вы не делите экземпляр своего класса междудля нескольких потоков, свойство не должно быть потокобезопасным.

Объекты, которые совместно используются несколькими потоками, где каждый поток может изменять состояние объекта, тогда все изменения состояния должны быть защищены таким образом, чтобы толькоодин поток за раз может изменить объект.

0 голосов
/ 25 ноября 2010

Вам должно быть хорошо с этим, однако есть несколько вещей, о которых я бы беспокоился ...

Если бы ваш объект Person должен был быть изменен или содержал некоторые доступные ресурсы, вы могли бы потенциально найти этотиз потоков не сможет прочитать эту переменную.Чтобы предотвратить это, вам нужно заблокировать объект перед чтением / записью, чтобы другие потоки не попали в него.Самый простой способ - использовать конструкцию lock {}.

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