Java锁-可重入锁

通俗来说:当线程请求一个由其它线程持有的对象锁时,该线程会阻塞,而当线程请求由自己持有的对象锁时,如果该锁是重入锁,请求就会成功,否则阻塞。

ReenTrantLock和synchronized

1、可重入性:两者都是可重入的

2、实现机制:synchronized关键字是基于jvm的,ReenTrantLock是基于jdk实现的。

3、性能:JDK5之后,synchronized引入了偏向锁,轻量级锁(自旋锁)后两者的性能相差不大。

4、锁的粒度:

synchronized关键字使用方便,但是对于粒度的控制不如可重入锁。

ReentrantLock需要手动释放,如果忘记释放容易引起死锁,但是对于粒度控制强于synchronized关键字,ReentrantLock解决死锁的方法是对获取锁的等待时间进行设置并且可以获取各种锁的信息,以及灵活的实现多路通知。

5、锁的实现机制上:sync操作Mark Word;lock调用Unsafe类的park()。

总结:在java内部,同一线程在调用自己类中其他synchronized方法/块或调用父类的synchronized方法/块都不会阻碍该线程的执行。就是说同一线程对同一个对象锁是可重入的,而且同一个线程可以获取同一把锁多次,也就是可以多次重入。因为java线程是基于“每线程(per-thread)”,而不是基于“每调用(per-invocation)”的(java中线程获得对象锁的操作是以线程为粒度的,per-invocation 互斥体获得对象锁的操作是以每调用作为粒度的)。

重入锁实现可重入性原理或机制是:每一个锁关联一个线程持有者和计数器,当计数器为 0 时表示该锁没有被任何线程持有,那么任何线程都可能获得该锁而调用相应的方法;当某一线程请求成功后,JVM会记下锁的持有线程,并且将计数器置为 1;此时其它线程请求该锁,则必须等待;而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会递增;当线程退出同步代码块时,计数器会递减,如果计数器为 0,则释放该锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值