重入

作者: 绝对是我没错 | 来源:发表于2018-02-25 09:15 被阅读4次

    关于重入的代码举例:

    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锁,这又是另外一回事

    相关文章

      网友评论

        本文标题:重入

        本文链接:https://www.haomeiwen.com/subject/vdflxftx.html