Java :多核 CPU 多线程下,原子操作有先后顺序吗?

发布于 2022-09-06 16:05:04 字数 130 浏览 18 评论 0

譬如 JAVA 里 ConcurrentHashMap 的 putIfAbsent 方法

两个线程同时调用这个方法 putIfAbsent ( key1,value1 )

他们之间会有先后顺序吗?不会两个都成功吧?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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

评论(2

入画浅相思 2022-09-13 16:05:04

不要把原子操作和同步操作弄混了。

原子操作:其中的代码的执行具有完整性保证,要么全部成功,要么全部失败,不会出现部分成功的情况

同步操作:同一时间仅有一个线程可以进入并执行。同步的代码自动具有原子性

所以,如果代码只有原子性,但不是同步的,那么多个线程是可以同时执行的,并且可能会有先后顺序。

但如果代码是同步的,那么同一时间不可能会有多个线程进入,即使是多核系统也是一样。

putIfAbsent是同步的,所以多个线程同时调用的时候必然是一个一个执行,key相同的情况下,仅第一个执行的线程会成功。

俏︾媚 2022-09-13 16:05:04

个人还没有研究这么深入,只找到相关讨论,你可以看一下:
对于多核CPU java中Thread.currentThread() 指的是哪个核上的线程?
JAVA多线程里面CAS中比较和更新怎么保证同步?

在第二个讨论中,有这么一段话:

但我们只需要对此共享变量的操作是原子就可以了,而总线锁定把CPU和内存的通信给锁住了,使得在锁定期间,其他处理器不能操作其他内存地址的数据,从而开销较大,所以后来的CPU都提供了缓存一致性机制,Intel的奔腾486之后就提供了这种优化。缓存一致性机制整体来说,是当某块CPU对缓存中的数据进行操作了之后,就通知其他CPU放弃储存在它们内部的缓存,或者从主内存中重新读取。

作者:潜龙勿用
链接:https://www.zhihu.com/questio...
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

所以 CPU 自身有 缓存一致性机制JVM 层面再有 CAS 等一系列方法来保证一个变量在 多线程线程与核心不绑定 的情况下保持原子性。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文