深刻理解ReentrantLockjava
在Java中一般实现锁有两种方式,一种是synchronized关键字,另外一种是Lock。两者其实并无什么必然联系,可是各有各的特色,在使用中能够进行取舍的使用。首先咱们先对比下二者。
实现:并发
首先最大的不一样:synchronized是基于JVM层面实现的,而Lock是基于JDK层面实现的。曾经反复的找过synchronized的实现,惋惜最终无果。但Lock倒是基于JDK实现的,咱们能够经过阅读JDK的源码来理解Lock的实现。
使用:性能
对于使用者的直观体验上Lock是比较复杂的,须要lock和realse,若是忘记释放锁就会产生死锁的问题,因此,一般须要在finally中进行锁的释放。可是synchronized的使用十分简单,只须要对本身的方法或者关注的同步对象或类使用synchronized关键字便可。可是对于锁的粒度控制比较粗,同时对于实现一些锁的状态的转移比较困难。例如:
特色:
tips synchronized Lock
锁获取超时 不支持 支持
获取锁响应中断 不支持 支持
优化:优化
在JDK1.5以后synchronized引入了偏向锁,轻量级锁和重量级锁,从而大大的提升了synchronized的性能,同时对于synchronized的优化也在继续进行。期待有一天能更简单的使用java的锁。对象
在之前不了解Lock的时候,感受Lock使用实在是太复杂,可是了解了它的实现以后就被深深吸引了。ip
Lock的实现主要有ReentrantLock、ReadLock和WriteLock,后二者接触的很少,因此简单分析一下ReentrantLock的实现和运行机制。同步
ReentrantLock类在java.util.concurrent.locks包中,它的上一级的包java.util.concurrent主要是经常使用的并发控制类.源码