2、源代码
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
implements ConcurrentMap<K,V>, Serializable {
private static final int MAXIMUM_CAPACITY =
1 <<
30;
private static final int DEFAULT_CAPACITY =
16;
static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE -
8;
private static final int DEFAULT_CONCURRENCY_LEVEL =
16;
static final int TREEIFY_THRESHOLD =
8;
static final int MIN_TREEIFY_CAPACITY =
64;
private static final int MAX_RESIZERS = (
1 << (
32 - RESIZE_STAMP_BITS)) -
1;
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
volatile V val;
volatile Node<K,V> next;
Node(
int hash, K key, V val, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.val = val;
this.next = next;
}
public final K getKey() {
return key; }
public final V getValue() {
return val; }
public final int hashCode() {
return key.hashCode() ^ val.hashCode(); }
public final String toString(){
return key +
"=" + val; }
public final V setValue(V value) {
throw new UnsupportedOperationException();
}
public final boolean equals(Object o) {
Object k, v, u; Map.Entry<?,?> e;
return ((o instanceof Map.Entry) &&
(k = (e = (Map.Entry<?,?>)o).getKey()) !=
null &&
(v = e.getValue()) !=
null &&
(k == key || k.equals(key)) &&
(v == (u = val) || v.equals(u)));
}
Node<K,V> find(
int h, Object k) {
Node<K,V> e =
this;
if (k !=
null) {
do {
K ek;
if (e.hash == h &&
((ek = e.key) == k || (ek !=
null && k.equals(ek))))
return e;
}
while ((e = e.next) !=
null);
}
return null;
}
}
static final int spread(
int h) {
return (h ^ (h >>>
16)) & HASH_BITS;
}
private static final int tableSizeFor(
int c) {
int n = c -
1;
n |= n >>>
1;
n |= n >>>
2;
n |= n >>>
4;
n |= n >>>
8;
n |= n >>>
16;
return (n <
0) ?
1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n +
1;
}
private static final sun.misc.Unsafe U;
private static final long SIZECTL;
private static final long TRANSFERINDEX;
private static final long BASECOUNT;
private static final long CELLSBUSY;
private static final long CELLVALUE;
private static final long ABASE;
private static final int ASHIFT;
static {
try {
U = sun.misc.Unsafe.getUnsafe();
Class<?> k = ConcurrentHashMap.class;
SIZECTL = U.objectFieldOffset
(k.getDeclaredField(
"sizeCtl"));
TRANSFERINDEX = U.objectFieldOffset
(k.getDeclaredField(
"transferIndex"));
BASECOUNT = U.objectFieldOffset
(k.getDeclaredField(
"baseCount"));
CELLSBUSY = U.objectFieldOffset
(k.getDeclaredField(
"cellsBusy"));
Class<?> ck = CounterCell.class;
CELLVALUE = U.objectFieldOffset
(ck.getDeclaredField(
"value"));
Class<?> ak = Node[].class;
ABASE = U.arrayBaseOffset(ak);
int scale = U.arrayIndexScale(ak);
if ((scale & (scale -
1)) !=
0)
throw new Error(
"data type scale not a power of two");
ASHIFT =
31 - Integer.numberOfLeadingZeros(scale);
}
catch (Exception e) {
throw new Error(e);
}
}
}