今天看啥  ›  专栏  ›  程序员鱼皮

Java 并发 Map 的 get 方法要加锁么?答案可不简单。。

程序员鱼皮  · 公众号  ·  · 2024-08-03 16:51
    

文章预览

此面试题和答案节选自我们最近弄的 面试鸭小程序 ,更多 大厂常问面试题 ,可以点击下面的小程序进行阅读。 回归面试题! 不需要加锁 。 保证 put 的时候线程安全之后,get 的时候只需要保证可见性即可,而可见性不需要加锁。 具体是通过 Unsafe#getXXXVolatile 和用 volatile 来修饰节点的 val 和 next 指针来实现的。 扩展 ConcurrentHashMap#get 方法源码 主要的定位逻辑在 e = tabAt(tab, (n - 1) & h)) != null 这行。 而 tabAt 内部使用的就是 Unsafe#getObjectVolatile 来保证可见性。 getObjectVolatile 实际是一个 native 方法,即本地方法,通过 JNI(Java Native Interface)调用底层的 C++ 实现。 它的原理就是根据对象的起始地址和字段的偏移量,直接从内存中读取字段的值。然后通过内存屏障确保该读取操作是 volatile 的,即对于其他线程是可见的。 所谓的内存屏障指的是 getObject ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览