段锁:系统提供一定数量的原始锁,根据传入对象的哈希值获取对应的锁并加锁publicclassSegmentLock{privateIntegersegments=16;//默认段数privatefinalHashMaplockMap=newHashMap<>();publicSegmentLock(){init(null,false);}publicSegmentLock(Integercounts,booleanfair){init(counts,fair);}privatevoidinit(Integercounts,booleanfair){if(counts!=null){segments=counts;}for(inti=0;i>1)%segments);lock.lock();}publicvoidunlock(Tkey){ReentrantLocklock=lockMap.get((key.hashCode()>>1)%segments);lock.unlock();}}哈希锁:在上述段锁的基础上发展起来的第二种锁策略,目的是实现真正的细粒度锁。每个具有不同哈希值的对象都可以获得自己独立的锁。publicclassHashLock{privatebooleanisFair=false;privatefinalSegmentLocksegmentLock=newSegmentLock<>();//分段锁privatefinalConcurrentHashMaplockMap=newConcurrentHashMap<>();publicHashLock(){}publicHashLock(booleanfair){isFair=fair;}publicvoidlock(Tkey){LockInfolockInfo;segmentLock.lock(key);try{lockInfo=lockMap.get(key);if(lockInfo==null){lockInfo=newLockInfo(isFair);lockMap.put(key,lockInfo);}else{lockInfo.count.incrementAndGet();}}最后{segmentLock.unlock(key);}lockInfo.lock.lock();}publicvoidunlock(Tkey){LockInfolockInfo=lockMap.get(key);if(lockInfo.count.get()==1){segmentLock.lock(key);尝试{if(lockInfo.count.get()==1){lockMap.remove(key);}}最后{segmentLock.unlock(key);}}lockInfo.count.decrementAndGet();lockInfo.unlock();}privatestaticclassLockInfo{publicReentrantLocklock;publicAtomicIntegercount=newAtomicInteger(1);privateLockInfo(booleanfair){this.lock=newReentrantLock(fair);}publicvoidlock(){this.lock.lock();}publicvoidunlock(){this.-grainedlocks这个锁的思路是借助java中的弱引用创建一个锁,把锁的销毁交给jvm的垃圾回收来避免额外的消耗。公共类WeakHashLock{privateConcurrentHashMap>lockMap=newConcurrentHashMap<>();privateReferenceQueuequeue=newReferenceQueue<>();publicReentrantLockget(Tkey){if(lockMap.size()>1000){clearEmptyRef();}WeakReferencelockRef=lockMap.get(key);ReentrantLocklock=(lockRef==null?null:lockRef.get());while(lock==null){lockMap.putIfAbsent(key,newWeakLockRef<>(newReentrantLock(),queue,key));lockRef=lockMap.get(key);锁=(lockRef==null?null:lockRef.get());if(lock!=null){返回锁;}clearEmptyRef();}returnlock;}@SuppressWarnings("unchecked")privatevoidclearEmptyRef(){Referenceref;while((ref=queue.poll())!=null){WeakLockRefweakLockRef=(WeakLockRef)ref;lockMap.remove(weakLockRef.key);}}privatestaticfinalclassWeakLockRefextendsWeakReference{finalTkey;privateWeakLockRef(Kreferent,ReferenceQueueq,Tkey){super(参考,q);this.key=key;}}}