`
alchimie
  • 浏览: 19670 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

单例模式

 
阅读更多

单例模式  确保一个类只有一个实例,并提供一个全局访问点。

注意:①如果使用多个类加载器,就有可能导致单例模式失交并产生多个实例。

   ②Java1.2之前如果只有该单例类引用它本身,那么该实例会被GC。

 

1.饿汉模式:类加载后就自动创建一个实例,不管用不用都存在。实用于程序总是使用此单例,或者创建和运行时负担不高时使用。

 

public class Singleton {
	private static Singleton instance = new Singleton();
	
	private Singleton() {}
	
	public static Singleton getInstance(){
		return instance;
	}
	
}

 

 

2.懒汉模式:只有当该类被调用getinstance时才会创建一个实例。

   ①使用synchronized创建(不推荐)

 

/*
 * synchronized
 */
public class Singleton {
	private static Singleton instance = null;

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

 

 

 ②双重检查加锁(不推荐):java1.5以后成立,必须加上volatile来使jvm保证不会对instance的初始化指令进行重排序。

    (正常情况下,对象创建语句instance = new Singleton()并不是原子的,简单来说,可以分为几个步骤,1 分配内存空间 2 创建空的对象 3 初始化空的对象 4 把初始化完成的对象引用指向 instance ,由于这几个步骤处理器可能并发执行,比如3、4 并发执行,所以在instance != null,不等于instance初始化完成,所以在另一个线程调用getInstance方法的时候,可能得到未初始化完成的instance *)。

/*
 * 双重检查加锁(double-checked locking)
 */
public class Singleton {
	private volatile static Singleton instance = null;

	private Singleton() {}

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

 

 ③内部静态类(推荐)

public class Singleton {
	private Singleton() {}

	private static class SingletonHolder{
		public static Singleton instance = new Singleton();
	} 
	
	public static Singleton getInstance(){
		return SingletonHolder.instance;
	}
}

 

* 参考http://www.cnblogs.com/aigongsi/archive/2012/04/26/2470296.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics