在Lock接口出现之前,Java中的应用程序对于多线程的并发安全处理只能基于synchronized关键字来解决。但是synchronized在有些场景中会存在一些短板,也就是它并不适合于所有的并发场景。但是Java5以后,Lock的出现可以解决synchronized在某些场景中的短板,它比synchronized更加灵活。
Lock的实现类ReentrantLock(重入锁),接下来就慢慢的了解下它。
ReentrantLock是Lock的实现类,是一个互斥的同步器,在多线程高竞争条件下,ReentrantLock比synchronized有更加优异的性能表现。
Lock使用起来比较灵活,但是必须有释放锁的配合动作
Lock必须手动获取与释放锁,而synchronized不需要手动释放和开启锁
Lock只适用于代码块锁,而synchronized可用于修饰方法、代码块等。
demo代码
static Map<String,Object> cacheMap=new HashMap<>();
static ReentrantReadWriteLock rwl=new ReentrantReadWriteLock();
static Lock read=rwl.readLock();
static Lock write=rwl.writeLock();
public static Object get(String key){
read.lock(); //读锁 ThreadA 阻塞
try{
return cacheMap.get(key);
}finally {
read.unlock(); //释放读锁
}
}
public static Object write(String key,Object value){
write.lock(); //Other Thread 获得了写锁
try{
return cacheMap.put(key,value);
}finally {
write.unlock();
}
}
特性:
1.可重入锁;
2.需要手动释放;
3.公平锁