java设计模式(3)-单例设计模式

in 23种设计模式 with 0 comment

设计模式:

是在大量的实践中总结和理论化之后优选的代码结构、编程风格以及解决问题的思考方式

单例设计模式

1.对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级的对象而言,是非常可观的一笔系统开销。

2.由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。

饿汗式

先创建实例,用静态方法调用 优点:实现起来简单,没有多线程同步问题。 缺点:当类Singleton被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间, 从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例), 当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。

public class SingleTon{
	//私有化构造器,使得在类的外部不能够使用此构造器
	private SingleTon(){}
	
	//在类的内部创建一个类的实例
	private static SingleTon instance = new SingleTon();
	
	
	//私有化此对象,通过公共的方法来调用,此公共方法只能用类来条用(static修饰),同时类的实例也应为static
	public static SingleTon getInstance(){
		return instance;
	}
}

调用

public class Test{

	public static void main (String[] args){
		SingleTon s1 = SingleTon.getInstance();
		SingleTon s2 = SingleTon.getInstance();
		System.out.println(s1 == s2); //true
	}
}

懒汉式(存在线程安全问题)

> 在静态方法创建实例并直接调用
> 如果不是线程同步,在多线程环境下,可能线程1正在创建单例时,线程2判断单例instance为空,就会创建多个实例
> 优点:实现起来比较简单,当类Singleton被加载的时候,静态变量static的instance未被创建并分配内存空间,
> 当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存。
> 缺点:在多线程环境中,这种实现方法是完全错误的,根本不能保证单例的状态。
public class SingleTon{
	private SingleTon(){}
	
	private static SingleTon instance = null;
	public static SingleTon getInstance(){
		if(instance == null){
			instance = new SingleTon();
		}
		return instatnce;
	}
}

调用

public class Test{

	public static void main (String[] args){
		SingleTon s1 = SingleTon.getInstance();
		SingleTon s2 = SingleTon.getInstance();
		System.out.println(s1 == s2); //true
	}
}

懒汉式(线程安全)

优点:在多线程情形下,保证了“懒汉模式”的线程安全。 缺点:众所周知在多线程情形下,synchronized 方法通常效率低,显然这不是最佳的实现方案。 例如SingleTon实例不为null的情况下,线程同步机制必须等待才能进入if块,而如果存在实例,完全可以跳过等待,直接返回,因为不用进入if块。

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

懒汉式(DCL双检查锁机制,线程安全)

public class SingleTon{
	private SingleTon(){}
	
	private static SingleTon instance = null;
	public static  SingleTon getInstance(){
		// 第一次检查instance是否被实例化出来,如果没有则进入if块
		if(instance == null){
			synchronized (Singleton.class) {
				// 某个线程取得了类锁,实例化对象前第二次检查instance是否已经被实例化出来,如果没有,才最终实例出对象
                if (instance == null) {
                    instance = new Singleton();
                }
			}
		}
		
			return instance;
	}
	
}

不一定是最好的实现方式,有错误请指出,不胜感激! 单例设计模式:ShutDown...

0评论