现在的位置: 首页 > 综合 > 正文

java设计模式_单例

2014年05月17日 ⁄ 综合 ⁄ 共 1295字 ⁄ 字号 评论关闭
public class Singleton {
	public static void main(String[] args) throws Exception {
		System.out.println(Class.forName("S1"));
		System.out.println(Class.forName("S2"));
		System.out.println(Class.forName("S3"));
		System.out.println(Class.forName("S4"));
	}
}

/*
 * 预先加载法 
 * 优点:1.线程安全的, 2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。
 * 缺点: 资源利用效率不高,可能这个单例不会需要使用也被系统加载
 * (资源利用效率不高,可能getInstance永远不会执行到,但是执行了该类的其他静态方法
 * 或者加载了该类(class.forName),那么这个实例仍然初始化了)
 */
class S1 {
	private S1() {
		System.out.println("ok1");
	}

	private static S1 instance = new S1();

	public static S1 getInstance() {
		return instance;
	}
}

/*
 * initialization on demand,延迟加载法 (考虑多线程) 
 * 优点:1.资源利用率高 
 * 缺点:第一次加载是发应不快,多线程使用不必要的同步开销大
 */
class S2 {
	private S2() {
		System.out.println("ok2");
	}

	private static S2 instance = null;

	public static synchronized S2 getInstance() {
		if (instance == null)
			instance = new S2();
		return instance;
	}
}

/*
 * initialization on demand - double check 延迟加载法改进之双重检测 (考虑多线程)
 * 优点:1.资源利用率高
 * 缺点:第一次加载是发应不快 ,由于java 内存模型一些原因偶尔会失败
 */
class S3 {
	private S3() {
		System.out.println("ok3");
	}

	private static S3 instance = null;

	public static S3 getInstance() {
		if (instance == null) {
			synchronized (S3.class) {
				if (instance == null)
					instance = new S3();
			}
		}
		return instance;
	}
}

/*
 * initialization on demand holder (考虑多线程) 
 * 优点:1.资源利用率高 缺点:第一次加载是发应不快
 */
class S4 {
	private S4() {
		System.out.println("ok4");
	}

	private static class S4Holder {
		static S4 instance = new S4();
	}

	public static S4 getInstance() {
		return S4Holder.instance;
	}
}

【上篇】
【下篇】

抱歉!评论已关闭.