Java-请帮忙看看为什么在多线程情况下偶然会获得相同id?

Java-请帮忙看看为什么在多线程情况下偶然会获得相同id?

归属感 发布于 2017-02-01 字数 277 浏览 1201 回复 3

小弟写了一个用在多线程的ID生成器,但偶然情况下会获得相同ID,请各位帮忙看看?

public class IDGenerator{
private static long id = 0;

public static long getID(){
return id++;
}
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

虐人心 2017-06-17 3 楼

id++; 多线程要加锁。否则就可能出现相同的。

甜柠檬 2017-05-24 2 楼

在jvm中自增不是原子性操作,它包含一个读操作和一个写操作。所以id++不是线程安全的,需要加锁。还有一种方式,可以将Long id改为AtomicInteger id,AtomicInteger是线程安全的。AtomicInteger是jdk1.5中提供的,在java.util.concurrent包中。如果要写多线程的操作可以好好看看java.util.concurrent提供的类。

灵芸 2017-05-06 1 楼

++操作非原子操作 会出现不一致性的 具体应用要注意并发问题,需要考虑在并发环境下,具体可以参考java.util.concurrent包 看看java并发开发的一些书籍之类的