Java之synchronized可重入性的理解
【摘要】 1 synchronized可重入性的理解
当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的临界资源时,如果当前锁是重入性,会请求将会成功,如果当前锁不是可重入性,会等待当前对象锁的释放,实际上该对象锁已被当前线程所持有,不可能再次获得,就会产生死锁,在java中synchronized是基于原子性...
1 synchronized可重入性的理解
当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的临界资源时,如果当前锁是重入性,会请求将会成功,如果当前锁不是可重入性,会等待当前对象锁的释放,实际上该对象锁已被当前线程所持有,不可能再次获得,就会产生死锁,在java中synchronized是基于原子性的内部锁机制,是可重入的,因此在一个线程调用synchronized方法的同时在其方法体内部调用该对象另一个synchronized方法,也就是说一个线程得到一个对象锁后再次请求该对象锁,是允许的,还有就是当子类继承父类时,子类也是可以通过可重入锁调用父类的同步方法,这就是synchronized的可重入性。
2 测试synchronized方法调用synchronized方法
1)代码
-
import java.io.*;
-
-
-
class Parent {
-
public synchronized void willDo() {
-
System.out.println("我是父类的方法");
-
}
-
}
-
-
-
class Child extends Parent {
-
-
@Override
-
public synchronized void willDo() {
-
super.willDo();
-
System.out.println("我是子类方法");
-
}
-
-
public static void main(String[] args) {
-
Child child = new Child();
-
child.willDo();
-
}
-
}
2)运行结果
-
我是父类的方法
-
我是子类方法
3 测试子类synchronized方法调用父类synchronized方法
1)代码
-
class Test implements Runnable {
-
static Test instance = new Test();
-
static int i=0;
-
static int j=0;
-
@Override
-
public void run() {
-
for(int j = 0; j < 10; j++) {
-
-
//当前实例对象锁
-
synchronized(this){
-
i++;
-
willDo();
-
}
-
}
-
}
-
-
public synchronized void willDo() {
-
j++;
-
}
-
-
public static void main (String[] args) throws java.lang.Exception {
-
Thread t1 = new Thread(instance);
-
t1.start();
-
t1.join();
-
System.out.println(i);
-
}
-
}
2)运行结果
10
文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。
原文链接:chenyu.blog.csdn.net/article/details/103813368
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)