Java :多核 CPU 多线程下,原子操作有先后顺序吗?
譬如 JAVA 里 ConcurrentHashMap 的 putIfAbsent 方法
两个线程同时调用这个方法 putIfAbsent ( key1,value1 )
他们之间会有先后顺序吗?不会两个都成功吧?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不要把原子操作和同步操作弄混了。
所以,如果代码只有原子性,但不是同步的,那么多个线程是可以同时执行的,并且可能会有先后顺序。
但如果代码是同步的,那么同一时间不可能会有多个线程进入,即使是多核系统也是一样。
putIfAbsent
是同步的,所以多个线程同时调用的时候必然是一个一个执行,key
相同的情况下,仅第一个执行的线程会成功。个人还没有研究这么深入,只找到相关讨论,你可以看一下:
对于多核CPU java中Thread.currentThread() 指的是哪个核上的线程?
JAVA多线程里面CAS中比较和更新怎么保证同步?
在第二个讨论中,有这么一段话:
所以
CPU
自身有 缓存一致性机制,JVM
层面再有CAS
等一系列方法来保证一个变量在 多线程 和 线程与核心不绑定 的情况下保持原子性。