多线程学习笔记(七)

喜夏-厌秋 提交于 2020-03-02 12:36:00

在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象锁的.这也证明在一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的.

public class ThreadReenter {
    synchronized public void firstService() {
        System.out.println("This is the first service!");
        secondService();
    }

    synchronized public void secondService() {
        System.out.println("This is the second service!");
        thirdService();
    }

    synchronized public void thirdService() {
        System.out.println("This is the third service!");
    }
}
public class FirstThread extends Thread {

    @Override
    public void run(){
        ThreadReenter threadReenter = new ThreadReenter();
        threadReenter.firstService();
    }
}
public class Run {
    public static void main(String[] args) {
        FirstThread firstThread = new FirstThread();
        firstThread.start();

    }
}

运行结果:

 

可重入锁的概念:

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

 

注:可重入锁也适用于父子类继承的环境中.

 

public class ThreadReenter {
    public int i = 10;
    synchronized public void ancestor(){
        try{
            i--;
            System.out.println("the ancestor i = " + i);
            Thread.sleep(200);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}
public class SonOfThreadReenter extends ThreadReenter{
    synchronized public void Posterity(){
        try{
            while(i > 0){
                i--;
                System.out.println("the Posterity i = " + i);
                Thread.sleep(200);
                this.ancestor();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
public class FirstThread extends Thread {

    @Override
    public void run(){
        SonOfThreadReenter sonOfThreadReenter = new SonOfThreadReenter();
        sonOfThreadReenter.Posterity();
    }
}
public class Run {
    public static void main(String[] args) {
        FirstThread firstThread = new FirstThread();
        firstThread.start();

    }
}

运行结果:

 

当存在父子类继承时,子类是完全可以通过可重入锁调用父类的同步方法的.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!