先上一段代码
//全程无分段锁 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源语,且听下回分解