synchronized如何实现可重入,和Lock区别

往期推荐

字符串常量池-优快云博客

AQS---抽象队列同步器、CLH锁队列-优快云博客

符号引用和直接引用、强引用、软引用、弱引用、虚引用-优快云博客

已老实!再学消息队列、死信队列-优快云博客

可重入

synchronized底层是利用计算机系统mutex Lock实现的。每一个可重入锁都会关联一个线程ID和一个锁状态status。

当一个线程请求方法时,会检查锁状态。
如果锁状态是0,代表该锁没有被占用,使用CAS操作获取锁,将线程ID替换成自己的线程D。
如果锁状态不是0,代表有线程在访问该方法。此时,如果线程D是自己的线程D,如果是可重入锁,会将status自增1,然后获取到该锁,进而执行相应的方法;如果是非重入锁,就会进入阻塞队列等待。

在释放锁时,
如果是可重入锁的,每一次退出方法,就会将status减1,直至status的值为0,最后释放该锁。
如果非可重入锁的,线程退出方法,直接就会释放该锁

和lock的区别

  • Synchronized内置的Java关键字,Lock是一个Java类
  • Synchronized无法判断获取锁的状态,Lock可以判断是否获取到了锁
  • Synchronized会自动释放锁,Lock必须要手动释放锁!如果不释放锁,死锁
  • Synchronized线程1(获得锁,阻塞)、线程2(等待,傻傻的等);Lock锁就不一定会等待下去;
  • Synchronized可重入锁,不可以中断的,非公平;Lock,可重入锁,可以判断锁,非公平(可以自己设置);
  • Synchronized适合锁少量的代码同步问题,Lock适合锁大量的同步代码!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值