全国服务热线:400-6136-679

位置:洛阳达内IT教育培训机构 > 学校动态 > Java中的各种锁之可重入锁和非重入锁

Java中的各种锁之可重入锁和非重入锁

来源:洛阳达内IT教育培训机构时间:2021/8/18 16:10:38

  Java中的各种锁之可重入锁和非重入锁
  可重入锁
  又称递归锁,是指当同程在外层方法中获得锁时,在进入内层方法时会自动获得锁(前提是锁对象必须是同一对象或class),不会因为之前已经获得的锁还没有释放而堵塞。
  ReentrantLock和synchronized在Java中都是可重入锁,其中一个优点就是可以在一定程度上避免死锁。
  类中的两种方法都是由内置锁synchronized修改的,doSomething()调用doOthers()方法。由于内置锁是可重入的,因此在调用doOthers()时,同程可以直接获得当前对象的锁,进入doOthers()进行操作。

  若不能重入锁,则当前线程在调用doOthers()前需要在执行doSomething()时获得当前对象的锁释放,实际上该对象的锁已经被当前线程所持有,而且无法释放,因此此此时会出现死锁。

Java中的各种锁之可重入锁和非重入锁

  非重入锁导致死锁的原因分析
  将ReentrantLock和非可重入锁NonReentrantLock的源代码进行对比,分析为什么非可重入锁在重复调用同步资源时会出现死锁。
  首先,ReentrantLock和NonReentrantLock继承了父类AQS,其父类AQS维护了同步状态status来计数重入次数,status的初始值为0。
  当线程试图获us==0表示没有其他线程执行同步代码,则将status置为1,当前线程开始执行,当线程试图获取锁时,可以重新进入锁。假如status!=0,判断当前线程是否获得了锁的线程,如果是,执行status+1,当前线程可以再次获得该锁。如果status不能重新入锁,则直接获取并尝试更新当前status的值!=0会导致锁获取失败,当前线程堵塞。
  释放锁时,可以重入锁,也可以先得到当前status的值,在当前线程是持有锁的前提下。若status-1==0,则表示当前线程中所有重复获取锁的操作都已完成,然后线程才能真正释放锁。而且非可重入锁是在确定当前线程为持锁线程后,直接将status置为0,释放锁。
领取试听课
每天限量名额,先到先得

尊重原创文章,转载请注明出处与链接:http://www.peixun360.com/3850/news/397502/违者必究! 以上就是洛阳达内IT教育培训机构 小编为您整理 Java中的各种锁之可重入锁和非重入锁的全部内容。

温馨提示:提交留言后老师会第一时间与您联系!热线电话:400-6136-679