/// <summary>
 /// Конструктор SingleElementPerThreadStorage
 /// </summary>
 public SingleElementPerThreadStorage()
 {
     _stackAccessLock = new object();
     _stackHead       = null;
     _perThreadData   = new ThreadLocal <SingleElementStorage <T> >(false);
     _containerCount  = 0;
 }
        /// <summary>
        /// Создать контейнер для текущего потока
        /// </summary>
        /// <returns>Созданный контейнер</returns>
        private SingleElementStorage <T> CreateThreadLocalStorage()
        {
            lock (_stackAccessLock)
            {
                var threadLocalStorage = GetUnownedLocalStorage();
                if (threadLocalStorage == null)
                {
                    threadLocalStorage      = new SingleElementStorage <T>(Thread.CurrentThread);
                    threadLocalStorage.Next = _stackHead;
                    _stackHead = threadLocalStorage;
                    _containerCount++;
                }

                _perThreadData.Value = threadLocalStorage;
                return(threadLocalStorage);
            }
        }
 /// <summary>
 /// Конструктор SingleElementStorage
 /// </summary>
 public SingleElementStorage()
 {
     _ownerThread = null;
     _next        = null;
 }
 /// <summary>
 /// Конструктор SingleElementStorage
 /// </summary>
 /// <param name="ownerThread">Поток - владелец контейнера</param>
 public SingleElementStorage(Thread ownerThread)
 {
     _ownerThread = ownerThread;
     _next        = null;
 }