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方法,锁有效, 证明用父类作为类锁,可以锁住子类对父类方法的调用,父类即使被子类调用了,其字节码对象还是只有一份,不会被不通的子类创建不同的字节码对象。