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

synchronized实现可重入、与lock区别

可重入

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 适合锁大量的同步代码!
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计