多线程中synchroniaed锁的特性和功能
Posted IT编程之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程中synchroniaed锁的特性和功能相关的知识,希望对你有一定的参考价值。
我们知道Java多线程中会出现线程安全和脏读等问题,这些问题我们可以通过synchronized关键字来增加对象锁进行方法同步来解决问题。synchronized关键字会有一下特性和功能;
synchronized锁重入
关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时可以再次得到该对象的锁。这也证明在一个synchronized方法/快的内部调用本类的其他synchronized方法/快时,是永久可以得到锁的。
程序举例,代码如下:
MyService.java类
MyThread.java类
test.java类
运行结果
可重入锁的概念是:自己可以再次获取自己的内部锁。比如一条线程获得了一个对象的锁,此时这个对象锁还没有释放,当其再次想获取这个对象的锁的时候还是可以获取的,如果锁不可重入的话,就会造成死锁。
可重入锁也支持在父子类继承的环境中。测试代码如下:
父类main.java类
子类sub.java类
自定义线程类IThread.java类
测试类Run.java类
运行结果:
在结果中我们可以看出当存在父子类继承关系时,子类是完全可以通过“可重入锁”调用父类的同步方法的。
出现异常时,锁自动释放
当一个线程执行的代码出现异常时,其所持有的锁会自动释放。代码如下:
method.java类
自定义线程ThreadA.java和ThreadB.java类:
测试类Test.java类
运行结果:
在运行结果中看出线程A出现异常后释放锁,线程B进入方法正常打印,得出结论当一个线程占用对象锁后,出现异常后自动释放锁。
关键字synchronized同步不具有继承性
测试代码如下:
父类husband.java
子类Sub.java
线程类ThreadA.java和THreadB.java
测试Test.java
运行结果:
synchronized关键字同步方法继承不过来,所以子类的方法中国需要添加synchronized关键字。添加后结果如下:
大家在学习过程中遇到过什么问题也欢迎在留言区盖楼讨论!
以上是关于多线程中synchroniaed锁的特性和功能的主要内容,如果未能解决你的问题,请参考以下文章