关键词搜索

源码搜索 ×
×

Java之synchronized可重入性的理解

发布2020-01-03浏览3410次

详情内容

1  synchronized可重入性的理解

当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态但当一个线程再次请求自己持有对象锁的临界资源时,如果当前锁是重入性,会请求将会成功,如果当前锁不是可重入性,会等待当前对象锁的释放,实际上该对象锁已被当前线程所持有,不可能再次获得,就会产生死锁,在java中synchronized是基于原子性的内部锁机制,是可重入的,因此在一个线程调用synchronized方法的同时在其方法体内部调用该对象另一个synchronized方法,也就是说一个线程得到一个对象锁后再次请求该对象锁,是允许的,还有就是当子类继承父类时,子类也是可以通过可重入锁调用父类的同步方法,这就是synchronized的可重入性。
 

 

 

 

 

 

 

 

 

2  测试synchronized方法调用synchronized方法

1)代码

  1. import java.io.*;
  2. class Parent {
  3. public synchronized void willDo() {
  4. System.out.println("我是父类的方法");
  5. }
  6. }
  7. class Child extends Parent {
  8. @Override
  9. public synchronized void willDo() {
  10. super.willDo();
  11. System.out.println("我是子类方法");
  12. }
  13. public static void main(String[] args) {
  14. Child child = new Child();
  15. child.willDo();
  16. }
  17. }

 

 

2)运行结果

  1. 我是父类的方法
  2. 我是子类方法

 

 

 

 

 

 

 

 

3 测试子类synchronized方法调用父类synchronized方法

1)代码

  1. class Test implements Runnable {
  2. static Test instance = new Test();
  3. static int i=0;
  4. static int j=0;
  5. @Override
  6. public void run() {
  7. for(int j = 0; j < 10; j++) {
  8. //当前实例对象锁
  9. synchronized(this){
  10. i++;
  11. willDo();
  12. }
  13. }
  14. }
  15. public synchronized void willDo() {
  16. j++;
  17. }
  18. public static void main (String[] args) throws java.lang.Exception {
  19. Thread t1 = new Thread(instance);
  20. t1.start();
  21. t1.join();
  22. System.out.println(i);
  23. }
  24. }

 

2)运行结果

10

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载