如何按照一定规则自动生成序列号码

要实现按照一定规则自动生成序列号,比如:666660000001,666660000002,666660000003等,这个字段不是表的主键,算是属于业务对应得一个字段,开始考虑直接查数据库,每次自动加一,但这样在并发时就会有问题;若加上synchronized载这段代码上,但在并发大的时候会不会对表产生死锁呢。不知道大家有没有更好的办法,分享一下吧。谢谢啦。

dao

4个回答

java.util.concurrent.atomic.AtomicInteger

int getAndIncrement()
以原子方式将当前值加 1。

其实这东西就是一个线程安全的count++
纯属计数用的 它可以保证你每次的到得值是一个递增不重复的值

如果你要保证入库正确的话 当程序结束运行的时候 这个值需要持久化 比如保存至文件 然后程序启动时再读入 这样就保证它永远最大

java.util.concurrent.atomic.AtomicInteger

int getAndIncrement()
以原子方式将当前值加 1。
正符合你的需求

而且synchronized 使用的得当也是不会死锁的

没必要用JAVA的同步

数据库默认的安全级别就能保证同步

除非你把安全级别调了

我觉得如果是oracle的sequence应该没有啥问题。
1. 如果需要这个值在保存到数据库的时候再被插入,那么肯定没有问题。因为会在db上进行阻塞排队。
2. 如果需要提前(在进入db之前生成),似乎也不需要加入synchronized 关键字。
如果没有记错的话,执行方法调用的时候每次都会开辟独立的堆栈区。
即同样是A方法,在同时被多个thread读取的时候,每个thread有独立的堆栈执行该方法,相互不调用。
此时如果执行select current_number from seq
这样的操作,在db层也是可以保证的(否则oracle可以关门了)

因此同样也不需要加锁。我们平常用的锁是多个对象同时访问一个变量,而不是方法。
以上是我的观点。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问