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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.