ConcurrentHashMap線程安全,相對hashtable提高性能

//hashtable 是針對整個hash列表做一個鎖定, //Collections.synchronizedMap :對所有方法加鎖,故性能比價差 //ConcurrentHashMap是針對桶鎖定,默認16個桶,故相對hashtable,性能很大的提高,鎖分段技術  //建議使用ConcurrentHashMap; final Segment[] segments; static final class Segment extends ReentrantLock implements Serializable {     transient volatile HashEntry[] table;     transient int count;     transient int modCount;     transient int threshold;     final float loadFactor; } static final class HashEntry {     final int hash;     final K key;     volatile V value;     volatile HashEntry next;          //volatile 保證可見性,讀取的時候不用加鎖 } //put(),remove(),clear()等操作針對桶(segment)加鎖, //get()不需要加鎖 //size()有沒加鎖? public int size() {     final Segment[] segments = this.segments;     int size;     boolean overflow; // true if size overflows 32 bits     long sum;         // sum of modCounts     long last = 0L;   // previous sum     int retries = -1; // first iteration isn't retry     try {         for (;;) {             if (retries++ == RETRIES_BEFORE_LOCK) {                 for (int j = 0; j < segments.length; ++j)                     ensureSegment(j).lock(); // force creation             }             sum = 0L;             size = 0;             overflow = false;             for (int j = 0; j < segments.length; ++j) {                 Segment seg = segmentAt(segments, j);                 if (seg != null) {                     sum += seg.modCount;                     int c = seg.count;                     if (c < 0 || (size += c) < 0)                         overflow = true;                 }             }             //嘗試兩次,如果modCount 一樣,則返回size,             //如果不一樣,鎖住所有的桶,重新開始計算size             if (sum == last)                 break;             last = sum;         }     } finally {         if (retries > RETRIES_BEFORE_LOCK) {             for (int j = 0; j < segments.length; ++j)                 segmentAt(segments, j).unlock();         }     }     return overflow ? Integer.MAX_VALUE : size; }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章