多线程中synchroniaed锁的特性和功能

Posted IT编程之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程中synchroniaed锁的特性和功能相关的知识,希望对你有一定的参考价值。

我们知道Java多线程中会出现线程安全和脏读等问题,这些问题我们可以通过synchronized关键字来增加对象锁进行方法同步来解决问题。synchronized关键字会有一下特性和功能;

synchronized锁重入

关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时可以再次得到该对象的锁。这也证明在一个synchronized方法/快的内部调用本类的其他synchronized方法/快时,是永久可以得到锁的。

程序举例,代码如下:

MyService.java类

MyThread.java类

多线程中synchroniaed锁的特性和功能

test.java类

多线程中synchroniaed锁的特性和功能

运行结果

多线程中synchroniaed锁的特性和功能

可重入锁的概念是:自己可以再次获取自己的内部锁。比如一条线程获得了一个对象的锁,此时这个对象锁还没有释放,当其再次想获取这个对象的锁的时候还是可以获取的,如果锁不可重入的话,就会造成死锁。

可重入锁也支持在父子类继承的环境中。测试代码如下:

父类main.java类

多线程中synchroniaed锁的特性和功能

子类sub.java类

多线程中synchroniaed锁的特性和功能

自定义线程类IThread.java类

多线程中synchroniaed锁的特性和功能

测试类Run.java类

多线程中synchroniaed锁的特性和功能

运行结果:

多线程中synchroniaed锁的特性和功能

在结果中我们可以看出当存在父子类继承关系时,子类是完全可以通过“可重入锁”调用父类的同步方法的。

出现异常时,锁自动释放

当一个线程执行的代码出现异常时,其所持有的锁会自动释放。代码如下:

method.java类

多线程中synchroniaed锁的特性和功能

自定义线程ThreadA.java和ThreadB.java类:

多线程中synchroniaed锁的特性和功能

测试类Test.java类

多线程中synchroniaed锁的特性和功能

运行结果:

多线程中synchroniaed锁的特性和功能

在运行结果中看出线程A出现异常后释放锁,线程B进入方法正常打印,得出结论当一个线程占用对象锁后,出现异常后自动释放锁。

关键字synchronized同步不具有继承性

测试代码如下:

父类husband.java

多线程中synchroniaed锁的特性和功能

子类Sub.java

多线程中synchroniaed锁的特性和功能

线程类ThreadA.java和THreadB.java

多线程中synchroniaed锁的特性和功能

测试Test.java

多线程中synchroniaed锁的特性和功能

运行结果:

多线程中synchroniaed锁的特性和功能

synchronized关键字同步方法继承不过来,所以子类的方法中国需要添加synchronized关键字。添加后结果如下:


大家在学习过程中遇到过什么问题也欢迎在留言区盖楼讨论!

更多精彩内容,请关注我们



以上是关于多线程中synchroniaed锁的特性和功能的主要内容,如果未能解决你的问题,请参考以下文章

十多线程控制类

DELPHI下的多线程程序设计

Java多线程锁的知识实例讲解

线程同步和并发

Java多线程和并发,synchronized

Java多线程程序设计初步入门