ReentrantLock和Synchronized

首先:ReentrantLock和Synchronized都是Java当中的锁,并且是重量级锁和可重入锁。他们之间的区别,可以分为以下两点:
1.用法上的区别:作用范围、是否可以中断、sleep和wait
2.实现原理的区别:moniter监视器操作对象头、AQS Node队列+state
3.锁升级过程:synchronized存在,lock不存在

用法区别:

(1)作用范围:
Synchronized可以加在类、方法、代码块和静态变量上,当加在类和静态变量上时,为类锁,锁的是当前类,当加在方法上和代码块上时锁的是对象。当为对象锁的情况下,当不同线程执行加锁代码块时会判断该代码块加锁的对象和自己是否是同一个对象,如果是同一个对象的话则阻塞。
Synchronized锁住的是对象还是代码块? synchronized(this/.class/Object),synchronize方法区别
Lock只能加在代码块上,并且需要手动解锁。Lock锁住的也是当前对象。
(2)synchronized它一般和object的wait、notify、notifyAll方法联合一起使用,而lock一般是和Condition类的await、signal、signalAll使用;

原理区别:

(1)synchronized采用了moniter监视器来监控对象头的加锁情况。ReentranLock采用AQS。
Monitor机制:

monitor相当于一个对象的钥匙,只有拿到此对象的monitor,才能访问该对象的同步代码。相反未获得monitor的只能阻塞来等待持有monitor的线程释放monitor。可以这样比喻吧,monitorenter
和monitorexit 对应的就是拿钥匙和还钥匙。 关于Monitor ,它从两个方面来支撑Java线程间的同步,互斥和协作
。synchronized
获取对象锁来保证同步代码的互斥执行;通过notify、notifyAll、wait进行线程之间的协同工作。所以Object
就是一个监视者。这可能就是Java在多线程方面的设计吧。 首先,每一个对象都有一个属于自己的monitor,其次如果线程未获取到singal
(许可),则线程阻塞。object可以比作医院的诊室,monitor 就是负责喊病人的护士,线程则是就诊的病人。
通过护士(监视器)的调度,诊室(synchronized锁住的对象)内只允许进入一个病人(线程),此病人(线程)在当前时间就拥有此诊室(对象)的使用权,也就是获取了许可。病人就诊完毕,则表明归还了诊室的使用权。然后护士再调度下一个等待的病人进入诊室(被阻塞的线程)。
走廊当中等待的病人们 == Wait Set
在这里插入图片描述

根据虚拟机规范的要求,在执行monitorenter指令时,首先要去尝试获取对象的锁,如果这个对象没被锁定,或者当前线程已经拥有了那个对象的锁,把锁的计数器加1;相应地,在执行monitorexit指令时会将锁计数器减1,当计数器被减到0时,锁就释放了。如果获取对象锁失败了,那当前线程就要阻塞等待,直到对象锁被另一个线程释放为止。
注意两点:
1、synchronized同步快对同一条线程来说是可重入的,不会出现自己把自己锁死的问题;
2、同步块在已进入的线程执行完之前,会阻塞后面其他线程的进入。
AQS
AQS使用一个FIFO的队列(也叫CLH队列,是CLH锁的一种变形),表示排队等待锁的线程。队列头节点称作“哨兵节点”或者“哑节点”,它不与任何线程关联。其他的节点与等待线程关联,每个节点维护一个等待状态waitStatus。结构如下图所示:
在这里插入图片描述
ReentrantLock先通过CAS尝试获取锁,
如果此时锁已经被占用,该线程加入AQS队列并wait()
当前驱线程的锁被释放,挂在CLH队列为首的线程就会被notify(),然后继续CAS尝试获取锁,此时:
非公平锁,如果有其他线程尝试lock(),有可能被其他刚好申请锁的线程抢占。
公平锁,只有在CLH队列头的线程才可以获取锁,新来的线程只能插入到队尾。
(注:ReentrantLock默认是非公平锁,也可以指定为公平锁)

AQS

(2)synchronized存在锁升级过程,ReentranLock不存在锁升级过程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值