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 .作者是什么想法?
* 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 .作者是什么想法?
public synchronized static ProcessEngine getProcessEngine() {
if (singleton == null) {
singleton = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();
}
return Configuration.singleton;
}
这样为何不可???
这种写法当有多个线程同时访问时会造成阻塞,而上例写法在singleton实例被创建时是没有任何影响的,你把脑力用在争论问题中了, 两种写法差距太大了,怎么不思考下?
是的,只考虑到singleton 创建之前不管是锁方法还是锁代码块同样都会被阻塞;
singleton创建之后,
被锁方法会阻塞.
被锁的代码块就不会被执行了,更不可能阻塞了.
"争论"是因为答非所问.
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()方法。
http://www.ibm.com/developerworks/cn/java/j-dcl.html
http://www.javaeye.com/topic/667937这段程序还是有点问题的.没有考虑双重检查锁定失效.
刚看到有问文章提到这个问题,很好.
http://www.ibm.com/developerworks/cn/java/j-dcl.html
http://www.javaeye.com/topic/667937