synchronize类锁用父类作为锁能否锁住代码块

如果有一个父类,Demo如下

public class Demo {
    public void demo1(){
        synchronized (Demo.class){
            while (true){
                System.out.println(Thread.currentThread());
            }
        }
    }
}

其中,代码块锁住的内容为父类的字节码对象,这个父类有两个子类继承其对象

public class DemoSon extends Demo implements Runnable{
    @Override
    public void run() {
        demo1();
    }
}

public class DemoSon2 extends Demo implements Runnable{
@Override
public void run() {
demo1();
}
}

此时测试一下

public class Test {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new DemoSon());
        Thread thread2 = new Thread(new DemoSon2());
        thread1.start();
        thread2.start();
    }
}

结果为

 

可以看到只有一个线程在运行,另一个线程没有进入demo1方法,锁有效, 证明用父类作为类锁,可以锁住子类对父类方法的调用,父类即使被子类调用了,其字节码对象还是只有一份,不会被不通的子类创建不同的字节码对象。

posted @ 2019-10-14 18:50  KylinStayHere  阅读(373)  评论(0编辑  收藏  举报