重入

关于重入的代码举例:

public class Widget{
    public synchronized void doSomething(){
          ...
    }
}
public class LoggingWidget extends Widget{
    public synchronized void doSometing(){
      System.out.println(toString() + ": calling doSomething");  
      super.doSomething();  
    }
}

这里如果调用了子类的doSometing方法,synchronized所使用的锁对象一直是子类对象,super.doSomething()锁对象也是子类对象。
为什么不是父类对象呢?我们来看下再这个例子中我们一般是怎么创建对象和调用方法的:

LoggingWidget lw = new LoggingWidget (); // 这里我们只创建了一个对象,是子类对象
lw.doSomething();

这里有几点原则:
1、synchronized函数,实际是synchronized(this)代码块包裹整个函数的简写,所用的锁就是当前this对象,要验证是否是同一个锁对象,实际我们可以再父类和子类的doSomething()方法中打印出this即可。
2、关于继承和super调用,并不会创建一个父类对象给子类对象去引用。

PS:静态方法同步所用的是class锁,这又是另外一回事

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容