Meituan-Dianping / Leaf

Distributed ID Generate Service
Apache License 2.0
6.42k stars 1.84k forks source link

getIdFromSegmentBuffer有个问题 #184

Closed zzclown closed 2 years ago

zzclown commented 2 years ago
     }
            long value = segment.getValue().getAndIncrement();
            if (value < segment.getMax()) {
                return new Result(value, Status.SUCCESS);
            }
        } finally {
            buffer.rLock().unlock();
        }
        waitAndSleep(buffer);
        buffer.wLock().lock();
        try {
            final Segment segment = buffer.getCurrent();
            long value = segment.getValue().getAndIncrement();
            if (value < segment.getMax()) {
                return new Result(value, Status.SUCCESS);
            }
            if (buffer.isNextReady()) {
                buffer.switchPos();
                buffer.setNextReady(false);
            } else {
                logger.error("Both two segments in {} are not ready!", buffer);
                return new Result(EXCEPTION_ID_TWO_SEGMENTS_ARE_NULL, Status.EXCEPTION);
            }
        } finally {

为什么waitAndSleep(buffer)后还要再进行一次segment.getValue().getAndIncrement();

leechliao commented 2 years ago

1、多线程下,如segment已经切换,直接进行一次获取value的操作,可以提高id下发的速度(没必要再走一次循环) 2、并且防止出错(在交换Segment前进行一次检查)

EchoGroot commented 1 year ago

@leechliao 为什么交换Segment后(buffer.setNextReady(false);),没有直接获取value,而是再走一次循环? 当然两种写法差距也不大