单例模式--读书笔记

饿汉式单例类


保证一个类仅有一个实例,并提供一个访问它的全局访问点。
方法:让类自身保存它的唯一实例。
package demo;

public class Singleton {

	private static Singleton instance;
	
	private Singleton() {
		// 构造方法使用private 就堵死了外界利用new 创建实例的可能
	}
	/**
	 * 获取本类实例的唯一全局访问点
	 * @return  instance
	 */
	public static Singleton getInstance() {
		if(instance==null)
		{
			instance=new Singleton();
		}
		return instance;
	}
	
	public static void main(String[] args) {
		Singleton singleton1=Singleton.getInstance();
		Singleton singleton2=Singleton.getInstance();
		System.out.println(singleton1.equals(singleton2));
		System.out.println(singleton1==singleton2);
	}
	
}

多线程时的单例

多线程同时访问Singleton类,调用getInstance方法时,有可能会造成多个实例。

可以给进程加一把锁来处理。synchronize(对象){代码块 }

当一个线程位于代码的临界区时,另一个进程不进入该临界区。

其他线程一直等待,知道"对象"被释放。

双重锁定

public class Singleton {

	private static Singleton instance;

	private Singleton() {
		// 构造方法使用private 就堵死了外界利用new 创建实例的可能
	}

	/**
	 * 先判断实例是否存在,不存在再加锁处理 保证多线程的安全 Double-Check Locking
	 * 
	 * @return  instance
	 */
	public static Singleton getInstance() {
		if (instance == null) {
			// 当instance 为null,并且同时两个线程调用getInstance()时,
			// 他们都可以通过第一个if语句的判断。然后进入synchronized语句。
			//此时,只有一个进程能够进入,另一个在外排队等候。
			synchronized (instance) {
				if (instance == null) {

					instance = new Singleton();

				}
			}
		}
		return instance;

}


懒汉式单例类

在自己被加载时,就将自己实例化。,提前占用系统资源。
package demo;

public final class Singleton2 {
        //final 阻止派生
	private static Singleton2 instance=new Singleton2();
	private Singleton2() {

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


转载于:https://my.oschina.net/sad7girl/blog/70020

你可能感兴趣的:(单例模式--读书笔记)