java - ConcurrentHashMap中的get()方法為什么可以不加鎖?
問(wèn)題描述
public V get(Object key) {Segment<K,V> s; // manually integrate access methods to reduce overheadHashEntry<K,V>[] tab;int h = hash(key);long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE;if ((s = (Segment<K,V>)UNSAFE.getObjectVolatile(segments, u)) != null && (tab = s.table) != null) { for (HashEntry<K,V> e = (HashEntry<K,V>) UNSAFE.getObjectVolatile (tab, ((long)(((tab.length - 1) & h)) << TSHIFT) + TBASE); e != null; e = e.next) {K k;if ((k = e.key) == key || (e.hash == h && key.equals(k))) return e.value; }}return null; }
為什么Vector的get就需要使用synchronized來(lái)加鎖而ConcurrentHashMap則不需要?而且CopyOnWriteArrayList也是使用了寫(xiě)時(shí)復(fù)制還能實(shí)現(xiàn)讀寫(xiě)并行,而顯然ConcrrentHashMap并沒(méi)有實(shí)現(xiàn)寫(xiě)時(shí)復(fù)制,它是怎么保證讀寫(xiě)并行時(shí)不會(huì)讀取到不一致中間狀態(tài)的呢?
問(wèn)題解答
回答1:這篇文章解釋的挺好的
相關(guān)文章:
1. angular.js - angular內(nèi)容過(guò)長(zhǎng)展開(kāi)收起效果2. dockerfile - [docker build image失敗- npm install]3. 在windows下安裝docker Toolbox 啟動(dòng)Docker Quickstart Terminal 失敗!4. docker-compose中volumes的問(wèn)題5. golang - 用IDE看docker源碼時(shí)的小問(wèn)題6. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問(wèn)題7. mac里的docker如何命令行開(kāi)啟呢?8. 我在centos容器里安裝docker,也就是在容器里安裝容器,報(bào)錯(cuò)了?9. docker內(nèi)創(chuàng)建jenkins訪(fǎng)問(wèn)另一個(gè)容器下的服務(wù)器問(wèn)題10. nignx - docker內(nèi)nginx 80端口被占用

網(wǎng)公網(wǎng)安備