多线程之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实现可重入锁的主要内容,如果未能解决你的问题,请参考以下文章