多线程之synchronoized实现可重入锁

Posted fighttoforever

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程之synchronoized实现可重入锁相关的知识,希望对你有一定的参考价值。

1.什么是可重入锁:

  当一个线程A去请求其他线程所持有的对象锁时,线程A就会被阻塞;

  但是,当线程A去请求自己持有的对象锁时,如果该对象锁是可重入锁,那么请求就会成功,否则也会发生阻塞;

2.用可重入锁有什么用:

  简单说,就是为了使线程可以获取自己的内部锁;

  比如,假如一个线程A获取了对象X的对象锁,在线程A未释放锁X之前,当再次请求对象锁X时,如果该对象锁X不是

  可重入锁,那么就会发生死锁的情况,否则请求成功;

  ------上代码------

  技术图片

 

输出结果:

  技术图片

 

to our:在一个已经被synchronized关键字修饰过的方法再去调用对象中其他被synchronized修饰的方法:

     线程main在执行到met1()内部的时候,由于该线程已经获取了该对象syncLock 的对象锁,当执行到调用met2() 的时候,会再次请求该对象的对象锁,如果没有可重入锁机制的话,由于该线程T还未释放在刚进入met1() 时获取的对象锁,当执行到调用met2() 的时候,就会出现死锁。

3.可重入锁可以避免死锁:

   假如有一个场景:用户名和密码保存在本地文件中,则登录验证方法和更新密码方法都应该被加synchronized,那么当更新密码的时候需要验证密码的合法性,所以需要调用验证方法,此时是可以调用的,否则就会发生死锁;

 

4.可重入锁的其他特性:

  支持父子类继承的环境中;

其他:

  synchronized其他特性:

    a.出现异常时,锁自动释放;

    b.将任意对象作为监视器; 

    c.单例模式--双重锁校验:

      ---上代码---

      技术图片

 

 

       

 

 

以上是关于多线程之synchronoized实现可重入锁的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程-可重入锁

ReentrantLock可重入锁在我们的代码中。

JUC - 多线程之悲观锁乐观锁,读写锁(共享锁独享锁),公平非公平锁,可重入锁,自旋锁,死锁

Java多线程,对锁机制的进一步分析

可重入锁 自旋锁,看这一篇就够了!

40 多线程——ReentrantLock 可重入锁