блокировка статической переменной - PullRequest
3 голосов
/ 29 апреля 2011

У меня есть следующий класс на стороне сервера.

public class Sample
{
    private enum Status
    {
        NotEvaluated,
        Yes,
        No
    }

    private static object _lockObj = new object();
    private static Status _status = Status.NotEvaluated;

    public static Status GetStatus()
    {
        if (_status == Status.NotEvaluated)
        {
            lock (_lockObj)
            {
                if (_status == Status.NotEvaluated)
                {
                    //some evaluation code which sets status to either Yes/No;
                    _status = Status.Yes;
                }
            }
        }

        return _status;
    }

}

Что-то не так в механизме блокировки сверху? мне нужно заблокировать вообще? Поскольку это серверная часть (будет несколько запросов) и переменная является статической, я думаю, что она должна быть заблокирована во время оценки.

поправь меня, если я ошибаюсь.

Спасибо

1 Ответ

2 голосов
/ 30 июня 2011

У вас нет / не должно быть внешней проверки для «if (_status == Status.NotEvaluated)».Хотя кажется, что ничего «плохого» не произойдет, если вы оставите его, есть вероятность, что второй поток может ввести это «если» без необходимости, непосредственно перед тем, как первый поток установит _status в Status.Yes.И да, вам нужно заблокировать:

«Как правило, вам нужно заблокировать доступ к любому доступному для записи общему полю».http://www.albahari.com/threading/part2.aspx

lock (_lockObj)
   {
      if (_status == Status.NotEvaluated)
         {
            // some evaluation code which sets status to either Yes/No;
            _status = Status.Yes;
         }
      return _status;    
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...