【并发编程】谈谈锁的理解

1. 可重入锁

1.1 可重入锁(递归锁)

  • 可重入锁:指的是同一线程外层函数获得锁后,再进入该线程的内层方法会自动获取锁 (前提,锁对象是同一个对象类似于家里面的大门,进入之后可以进入厕所、厨房等

  • Java中ReentranLock(显示锁)和synchronized(隐式锁)都是可重入锁,可重入锁的一个优点:是可在一定程度避免死锁 

  • 隐式锁:(即synchronized关键字使用的锁)默认是可重入锁(同步块、同步方法)

1.2 隐式锁synchronized

  1. 每个锁对象拥有一个锁计数器和一个指向持有该锁的线程的指针
  2. 当执行monitorenter时,如果目标锁对象的计数器为零,那么说明它没有被其他线程持有,Java虚拟机会将该锁对象的持有线程设置为当前线程,并且将其计数器加1,否则需要等待,直至持有线程释放该锁
  3. 当执行monitorexit时,Java虚拟机则锁对象的计数器减1。计数器为零代表锁已经被释放

【并发编程】谈谈锁的理解_第1张图片

public class DemoSync

你可能感兴趣的:(并发编程,java)