Skip to content

Latest commit

 

History

History
24 lines (12 loc) · 1.27 KB

File metadata and controls

24 lines (12 loc) · 1.27 KB

Synchronized 和 ReentrantLock 锁机制,怎么判断重入锁的,会不会是死锁?


  • API方面:

synchronized既可以修饰方法,也可以修饰代码块。ReentrantLock只能在方法体中使用。

  • 公平锁:

synchronized的锁是非公平锁,ReentrantLock默认情况下也是非公平锁,但可以通过带布尔值的构造函数要求使用公平锁。

  • 等待可中断:

假如业务代码中有两个线程,Thread1 Thread2。假设 Thread1 获取了对象object的锁,Thread2将等待Thread1释放object的锁。

使用synchronized。如果Thread1不释放,Thread2将一直等待,不能被中断。synchronized也可以说是Java提供的原子性内置锁机制。内部锁扮演了互斥锁(mutual exclusion lock ,mutex)的角色,一个线程引用锁的时候,别的线程阻塞等待。

使用ReentrantLock。如果Thread1不释放,Thread2等待了很长时间以后,可以中断等待,转而去做别的事情。

  • 至于判断重入锁

ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。