`

ConcurrentHashMap 分段锁消失之谜-get

 
阅读更多

先上一段代码

//全程无分段锁
public V get(Object key) {
        Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;
        int h = spread(key.hashCode());
        if ((tab = table) != null && (n = tab.length) > 0 &&
//tabAt() 里面调用了U.getObjectVolatile(tab, ((long)i << ASHIFT) + //ABASE); 亲们可能都知道数据在内存存储都是有位置的,这位置就是内存地址
//volatile 做java的应该都知道,他可以保证数据的可见性,一般来说锁是保证了
//可见性和顺序性。
            (e = tabAt(tab, (n - 1) & h)) != null) {
            if ((eh = e.hash) == h) {
                if ((ek = e.key) == key || (ek != null && key.equals(ek)))
                    return e.val;
            }
            else if (eh < 0)
                return (p = e.find(h, key)) != null ? p.val : null;
            while ((e = e.next) != null) {
                if (e.hash == h &&
                    ((ek = e.key) == key || (ek != null && key.equals(ek))))
                    return e.val;
            }
        }
        return null;
    }

 看完了put和get果然没有分段锁了,那么它是怎么保证线程安全的呢,其实前文章已经有了答案--Unsafe.class 。运用了硬件的CAS机制保障。果然如网上所说,硬件技术推动了软件技术发展。至于什么叫硬件级的CAS源语,且听下回分解

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics