Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

2.1.8 继承环境下的锁重入

锁重入也支持在父子类继承的环境。

创建实验项目synLockIn_2,类Main.java代码如下:


package myservice;

public class Main {

public int i = 10;

synchronized public void operateIMainMethod() {
    try {
        i--;
        System.out.println("main print i=" + i);
        Thread.sleep(100);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

子类Sub.java代码如下:


package myservice;

public class Sub extends Main {

synchronized public void operateISubMethod() {
    try {
        while (i > 0) {
            i--;
            System.out.println("sub print i=" + i);
            Thread.sleep(100);
            super.operateIMainMethod();
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

自定义线程类MyThread.java代码如下:


package extthread;

import myservice.Main;
import myservice.Sub;

public class MyThread extends Thread {
@Override
public void run() {
    Sub sub = new Sub();
    sub.operateISubMethod();
}

}

运行类Run.java代码如下:


package test;

import extthread.MyThread;

public class Run {
public static void main(String[] args) {
    MyThread t = new MyThread();
    t.start();
}
}

程序运行结果如图2-14所示。

图2-14 重入到父类中的锁

此示例说明,在存在父子类继承关系时,子类是完全可以通过锁重入调用父类的同步方法的。