Java-请帮忙看看为什么在多线程情况下偶然会获得相同id?
小弟写了一个用在多线程的ID生成器,但偶然情况下会获得相同ID,请各位帮忙看看?
public class IDGenerator{
private static long id = 0;
public static long getID(){
return id++;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
id++; 多线程要加锁。否则就可能出现相同的。
在jvm中自增不是原子性操作,它包含一个读操作和一个写操作。所以id++不是线程安全的,需要加锁。还有一种方式,可以将Long id改为AtomicInteger id,AtomicInteger是线程安全的。AtomicInteger是jdk1.5中提供的,在java.util.concurrent包中。如果要写多线程的操作可以好好看看java.util.concurrent提供的类。
++操作非原子操作 会出现不一致性的 具体应用要注意并发问题,需要考虑在并发环境下,具体可以参考java.util.concurrent包 看看java并发开发的一些书籍之类的