[code="java"]
/*
- This file is part of aion-unique . *
- aion-unique is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version. *
- aion-unique is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details. *
- You should have received a copy of the GNU General Public License
- along with aion-unique. If not, see http://www.gnu.org/licenses/. */ package com.aionemu.chatserver.utils;
import java.util.BitSet;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
/**
- Simplified version of idfactory
-
@author ATracer
*/
public class IdFactory
{
private final BitSet idList = new BitSet();
private final ReentrantLock lock = new ReentrantLock();
private AtomicInteger nextMinId = new AtomicInteger(1);protected static IdFactory instance = new IdFactory();
public int nextId()
{
try
{
lock.lock();
int id = idList.nextClearBit(nextMinId.intValue());
idList.set(id);
nextMinId.incrementAndGet();
return id;
}
finally
{
lock.unlock();
}
}public static IdFactory getInstance()
{
return instance;
}public static void main(String[] xiaoe)
{
BitSet idList = new BitSet();
for (int i = 0; i < 100; i++)
System.out.println(idList.nextClearBit(i));
}
}
[/code]
我觉得有两个问题:
1. 这里既然已经用锁同步了,就可以不用atomic类
2. BitSet有点画蛇添足的味道
不知道作者为何要这么设计,求解。谁能指点下这么写的好处。