java单例模式

1. 简单使用的饿汉单例模式

/**
 * 单例模式之饿汉模式,工作常用
 */
public class Single1 {
	//1.构造函数私有,在外部不能通过构造函数创建对象
	private Single1() {

	}
	//2.在内部创建一个对象
	private static Single1 single = new Single1();

	//3.通过静态的方式可以对外访问
	public static Single1 getSingle() {
		return single;
	}
}


/**
 * 单例模式测试方法
 */
public class SingleTest {
	public static void main(String[] args) {
		Single1 s1 = Single1.getSingle();
		Single1 s2 = Single1.getSingle();
		System.out.println(s1 == s2); // 测试s1和s2是否为同一个对象
	}
}

2.懒汉单例模式

/**
 * 懒汉式单例模式,在使用的时候去创建对象,节省内存. 
 * 但懒汉式单例模式,在多线程可能会创建多个单例对象
 */
public class Single2 {
	private Single2() {
	}

	// 默认不创建单例对象
	private static Single2 single = null;

	public static Single2 getSingle() {
		//如果有两个线程同时执行判断是否为空,就会创建两个单例对象
		if (single == null) {
			// 在使用的时候,创建单例对象
			single = new Single2();
		}
		return single;
	}
}

3. 懒汉单例模式升级双检索模式

/**
 * 懒汉式单例模式升级版,著名的双检锁模式
 * 通过两次检查判断单例对象是否存在,在第一次判断之后,加上锁之后,同时只运行一个线程进入,
 * 如果单例对象为空,则创建单例对象昂,不为空则返回单例对象
 */
public class Single3 {
	private Single3() {
	}

	private static Single3 single = null;

	private static Object obj = new Object();

	public static Single3 getSingle() {
		if (single == null) {
			synchronized (obj) {
				if (single == null) {
					single = new Single3();
				}
			}
		}
		return single;
	}
}
秋风 2017-07-04