org.jbpm.api.Configuration /** get the singleton ProcessEngine that is created from the default  
   * configuration file 'jbpm.cfg.xml'. */  
  public static ProcessEngine getProcessEngine() {   
    if (singleton == null) {   
      synchronized (Configuration.class) {   
        if (singleton == null) {   
          singleton = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();   
        }   
      }   
    }   
    return Configuration.singleton;   
  }  为什么不直接把方法synchronized, 而非要代码块synchronized, synchronized块之外的代码也并不复杂. 并且这样判断了两次singleton == null .作者是什么想法?

解决方案 »

  1.   

    原因只有一个, public static ProcessEngine getProcessEngine() {  方法是静态的,属于类实例,说到这里了 可明白?如果不明白就别看源码了。
      

  2.   

    synchronized  和static不能同时在外面声明方法
      

  3.   


      public synchronized  static ProcessEngine getProcessEngine() {   
          if (singleton == null) {   
              singleton = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();   
          }   
        return Configuration.singleton;   
      }  
    这样为何不可???
      

  4.   

    在本方法中synchronized代码块内的代码几乎就是整个方法的代码.就一个判断和return 语句在外面.
      

  5.   

    你不认为你这种写法和上例相差甚大么?
    这种写法当有多个线程同时访问时会造成阻塞,而上例写法在singleton实例被创建时是没有任何影响的,你把脑力用在争论问题中了, 两种写法差距太大了,怎么不思考下?
      

  6.   


    是的,只考虑到singleton 创建之前不管是锁方法还是锁代码块同样都会被阻塞;
    singleton创建之后,
    被锁方法会阻塞.
    被锁的代码块就不会被执行了,更不可能阻塞了.
    "争论"是因为答非所问.
      

  7.   

    我没有看过org.jbpm.api.Configuration的源码,所以不能从整体上来评论。就你给出的一段代码而言,如果访问getProcessEngine()方法的线程不多的话,像下面这样写确实简单明了:
     public synchronized  static ProcessEngine getProcessEngine() {   
          if (singleton == null) {   
              singleton = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();   
          }   
        return Configuration.singleton;   
      }  如果作者不是出于特殊原因的话,他那样写就只能说明他保持良写的编程习贯。试想一下,如果有很多线程访问getProcessEngine()方法的话,将synchronized加在方法前,是不是每个线程都要在方法getProcessEngine()外行等待?即使singleton不为空。但按作者那样写,如果singleton不为空,那么所有的线程都可以快速地执行getProcessEngine()方法。
      

  8.   

    至于为什么要使用两次 if (singleton == null),那是因为,这样才能做到既保抚持单例,又锁代码块(不是锁方法)。如果去掉前面的if (singleton == null),那么和public synchronized static ProcessEngine getProcessEngine()没有什么区别了,如果去掉后面的if (singleton == null)就不是单例了。
      

  9.   


    http://www.ibm.com/developerworks/cn/java/j-dcl.html
    http://www.javaeye.com/topic/667937这段程序还是有点问题的.没有考虑双重检查锁定失效.
      

  10.   


    刚看到有问文章提到这个问题,很好.
    http://www.ibm.com/developerworks/cn/java/j-dcl.html
    http://www.javaeye.com/topic/667937
      

  11.   

    http://www.ibm.com/developerworks/cn/java/j-dcl.html