设计模式-单例模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-单例模式相关的知识,希望对你有一定的参考价值。

1.饿汉式,优点是实现比较简单,不存在多线程同步问题,避免synchronized所造成的性能问题,缺点是当类被加载的时候,会初始化静态的实例,静态实例被创建并分配内存空间,实例会一直占用这段内存,即使没有用到这个实例,当类被卸载时,静态实例被摧毁,并释放所占用的内存,因此在某些特定条件下会耗费内存

package com.mycompany.singletondemo;

/**
 * 线程安全 ,饿汉式
 * @author Administrator
 *
 */
public class Singleton1 {
	
	//构造方法私有化
	private Singleton1(){}
	
	//定义static和final类型的实例对象
	private static final Singleton1 instance = new Singleton1();
	
	/*
	 * 通过静态方法获取实例
	 */
	public static Singleton1 getInstance(){
		return instance;
	}
}


2.饱汉式,优点实现比较简单,当类被加载时,静态实例未被创建且未分配内存空间,当getInstance方法第一次被调用时,初始化实例并分配内存,因此在某些特定条件下会节约内存,缺点是并发环境下很可能出现多个实例

package com.mycompany.singletondemo;

/**
 * 线程非安全,饱汉式
 * @author Administrator
 *
 */
public class Singleton2 {
	
	//构造方法私有化
	private Singleton2(){}
	
	//定义变量
	private static Singleton2 instance;
	
	//定义静态方法获取实例
	public static Singleton2 getInstance(){
		if (instance == null) {
			instance = new Singleton2();
		}
		
		return instance;
	}
}


3.饱汉式,优点是使用synchronized关键字避免多线程访问时,出现多个实例,缺点同步方法频繁调用时,效率低

package com.mycompany.singletondemo;

/**
 * 线程安全,同步方法频繁调用时,效率低,多线程访问不会出现多个实例
 * @author Administrator
 *
 */
public class Singleton3 {
	private Singleton3(){}
	
	private static Singleton3 instance;
	
	public static synchronized Singleton3 getInstance(){
		if(instance == null){
			instance = new Singleton3();
		}
		
		return instance;
	}
}


4.线程安全,效率高,最优方案

package com.mycompany.singletondemo;

/**
 * 线程安全,效率高,内存占用少
 * @author Administrator
 *
 */
public class Singleton4 {
	private Singleton4(){}
	
	private static volatile Singleton4 instance;
	
	public static Singleton4 getInstance(){
		if (instance == null) {
			synchronized (Singleton4.class) {
				if (instance == null) {
					instance = new Singleton4();
				}
			}
		}
		
		return instance;
	}
}


本文出自 “素颜” 博客,谢绝转载!

以上是关于设计模式-单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块

设计模式之单例模式

设计模式之单例模式