1、降低锁竞争的程度:减少锁的持有时间,降低锁的请求频率,使用带有协调机制的独占锁。缩小加锁代码的范围;缩小锁的粒度,对相互对立的共享变量使用不同的锁;对单个锁分解为两个锁,到分解为多个锁的锁分段,使同一时刻可以让更多线程同时操作不同分段锁锁定的分段。
2、基于散列的Map实现,其中使用了锁分段技术。它拥有N_LOCKS个锁,并且每个锁保护散列桶的一个子集。大多数方法,列入get,都只需要获得一个锁,而有些方法则需要获得所有的锁,但并不要求同时获得,例如clear方法的实现。
3、代码示例如下:
/** * StripedMap * <p/> * Hash-based map using lock striping * * @author Brian Goetz and Tim Peierls */ @ThreadSafe public class StripedMap { // Synchronization policy: buckets[n] guarded by locks[n%N_LOCKS] private static final int N_LOCKS = 16; private final Node[] buckets; private final Object[] locks; private static class Node { Node next; Object key; Object value; } public StripedMap(int numBuckets) { buckets = new Node[numBuckets]; locks = new Object[N_LOCKS]; for (int i = 0; i < N_LOCKS; i++) locks[i] = new Object(); } private final int hash(Object key) { return Math.abs(key.hashCode() % buckets.length); } public Object get(Object key) { int hash = hash(key); synchronized (locks[hash % N_LOCKS]) { for (Node m = buckets[hash]; m != null; m = m.next) if (m.key.equals(key)) return m.value; } return null; } public void clear() { for (int i = 0; i < buckets.length; i++) { synchronized (locks[i % N_LOCKS]) { buckets[i] = null; } } } }