package com.taobao.tddl.executor.common; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.ReentrantLock; /** * Description: 简单自增序列号生成器 * * @author: qihao * @version: 1.0 Filename: AtomicNumberCreator.java Create at: Aug 10, 2010 * 3:13:10 PM Copyright: Copyright (c)2010 Company: TaoBao Modification History: * Date Author Version Description * ------------------------------------------------------------------ Aug 10, * 2010 qihao 1.0 1.0 Version */ public class AtomicNumberCreator { /** * int序号自增器,由于复位时需要进行DLC,所以这里是volatile的 */ private volatile AtomicInteger integerNumber = new AtomicInteger(0); private final ReentrantLock integerLock = new ReentrantLock(); /** * long序号自增器,由于复位时需要进行DLC,所以这里是volatile的 */ private volatile AtomicLong longNumber = new AtomicLong(0); private final ReentrantLock longLock = new ReentrantLock(); private AtomicNumberCreator(){ } public static AtomicNumberCreator getNewInstance() { return new AtomicNumberCreator(); } /** * 生成int的自增数字,从1开始自增,当达到Integer.MAX_VALUE 时会恢复到初始值1 * * @return */ public int getIntegerNextNumber() { int num = integerNumber.incrementAndGet(); if (num < 0) { // 为了保证多线程复位原子性进行DCL双检查锁 integerLock.lock(); try { if (integerNumber.get() < 0) { // DCL双检查锁通过后对AtomicInteger进行复位 integerNumber.set(0); } return integerNumber.incrementAndGet(); } finally { integerLock.unlock(); } } return num; } /** * 生成long的自增数字,从1开始自增,当达到Long.MAX_VALUE 时会恢复到初始值1 * * @return */ public long getLongNextNumber() { long num = longNumber.incrementAndGet(); // 为了保证多线程复位原子性进行DCL双检查锁 if (num < 0) { longLock.lock(); try { if (longNumber.get() < 0) { // DCL双检查锁通过后对AtomicLong进行复位 longNumber.set(0); } return longNumber.incrementAndGet(); } finally { longLock.unlock(); } } return longNumber.get(); } }