示例#1
0
        /// <summary>
        /// 生成下一个序列号
        /// </summary>
        public long NextValue()
        {
            // 当前区间不存在,重新获取一个区间
            if (null == _currentRange)
            {
                lock (_lock)
                {
                    if (null == _currentRange)
                    {
                        _currentRange = _sequenceRangeManager.NextRange(_name);
                    }
                }
            }

            // 当value值为-1时,表明区间的序列号已经分配完,需要冲洗那获取区间
            long value = _currentRange.GetAndIncrement();

            if (value == -1)
            {
                lock (_lock)
                {
                    for (; ;)
                    {
                        if (_currentRange.Over)
                        {
                            _currentRange = _sequenceRangeManager.NextRange(_name);
                        }

                        value = _currentRange.GetAndIncrement();
                        if (value == -1)
                        {
                            continue;
                        }
                        break;
                    }
                }
            }

            if (value < 0)
            {
                throw new ArgumentException($"序列值溢出。value = {value}");
            }

            return(value);
        }