﻿# V3223\. Inconsistent use of a potentially shared variable with and without a lock can lead to a data race\.

Анализатор обнаружил ситуацию, в которой общий ресурс используется без блокировки, однако в другом месте этот ресурс используется с блокировкой\.

Рассмотрим пример:

```cpp
public class UserSessionManager
{
  private static int _activeSessionCount = 0;
  private static readonly object _lock = new object();

  public void StartSession()
  {
    lock (_lock)
    {
      _activeSessionCount++;
      ....
    }
  }

  public void EndSession()
  {
    _activeSessionCount--;
    ....
  }

  ....
}
```

Класс `UserSessionManager` управляет числом активных сессий\. Метод `StartSession` корректно инкрементирует счётчик с использованием `lock`, однако метод `EndSession` декрементирует тот же счётчик без блокировки\. Это нарушает согласованность доступа к общему ресурсу `_activeSessionCount`\.

Отсутствие блокировки может привести к гонке данных при одновременной работе нескольких потоков\.

Для корректной работы в метод `EndSession` нужно добавить `lock`:

```cpp
public class UserSessionManager
{
  private static int _activeSessionCount = 0;
  private static readonly object _lock = new object();

  public void StartSession()
  {
    lock (_lock)
    {
      _activeSessionCount++;
      ....
    }
  }

  public void EndSession()
  {
    lock (_lock)
    {
      _activeSessionCount--;
      ....
    }
  }

  ....
}
```