java生成16位唯一值做主键

仅限一台服务器

关于多个表主键的生成,在不建议扩展主键长度的前提下,通过对时间戳加锁来解决主键重复问题

import org.apache.commons.lang.StringUtils;

import com.fto.sql.UniqueTimestamp;

public class Test {
	public static UniqueTimestamp UT = new UniqueTimestamp();

	public static String generateId() {
		synchronized (UT) {
			return StringUtils.leftPad(Long.toHexString(UT.getUniqueTimestamp()).toUpperCase(), 16, '0');
		}
	}

	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					System.out.println(generateId());
				}
			}).start();
		}
	}
}

从100个线程同时执行的结果来看,没有重复,但是目前还有几个疑问:

1.会不会出现两次执行时间差小于时间戳最小单位?

2.虽然可能解决了问题,但是效率是否降低影响整体?

3.回到问题,除了此方法,是否可以生成16位唯一值?

阅读更多

没有更多推荐了,返回首页