java双重检查加锁机制在freemarker引擎单例下的应用

并不是每次进入getEngin()方法都需要同步,而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块。

双重检查加锁机制的时间会使用一个关键字volatile(java 1.4版本以上才有),他的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。 

package com.vnetoo.redu.core.utils;

import java.io.File;
import java.io.IOException;
import java.util.Locale;

import freemarker.template.Configuration;
import freemarker.template.ObjectWrapper;
import freemarker.template.TemplateExceptionHandler;

public class FreemarkerEngine {
	private volatile static Configuration cfg;
	private static final String _root="/WEB-INF/ftl";
	
	public static Configuration getEngin() throws IOException {
		if (cfg == null) {
			 synchronized (Configuration.class) {  
				if(cfg==null){
					String tplRoot = PathKit.getWebRootPath() + _root;
					// 封装 freemarker
					cfg = new Configuration();
		
					cfg.setDirectoryForTemplateLoading(new File(tplRoot));
					init(cfg);
				}
			 }
		}
		return cfg;
	}
	private static void init(Configuration cfg) {
		cfg.setTemplateUpdateDelay(0);
		cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
		cfg.setObjectWrapper(ObjectWrapper.BEANS_WRAPPER);
		cfg.setDefaultEncoding("UTF-8");
		cfg.setOutputEncoding("UTF-8");
		cfg.setLocale(Locale.US); 
	}
}



草木全
分享到:
共 0 条  此列表为空  当前1/1页

© 2014 究问社区 copyRight 豫ICP备13003319号-1