设计模式学习笔记 - 6 - 单例模式

单例模式:(Singleton)

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


示例代码:


public class Singleton {

	
	private static Singleton uniqueInstance;
	
	public static void main(String[] args) {
		Singleton aSingleton = Singleton.getInstance();
		System.out.println(aSingleton);
	}
	
	private Singleton(){}
	
	public static Singleton getInstance() {
		if( uniqueInstance == null )
			uniqueInstance = new Singleton();
		return uniqueInstance;
	}

	@Override
	public String toString() {
		return "This is a Singleton Instance.";
	}	
}

运行结果:

This is a Singleton Instance.


对单例模式的改进:


1. 对于多线程的改进

from:

public static Singleton getInstance()

to:

public static synchronized Singleton getInstance()

synchronized  迫使我们在进入方法之前,进行同步, 先要等待其他线程离开该方法后才能进入该方法。
但是缺点是同步的方法可能造成程序执行效率下降100倍。

2.  提前实例化

to:

public class Singleton {

	
	private static Singleton uniqueInstance = new Singleton();
	
	public static void main(String[] args) {
		Singleton aSingleton = Singleton.getInstance();
		System.out.println(aSingleton);
	}
	
	private Singleton(){}
	
	public static synchronized Singleton getInstance() {
		return uniqueInstance;
	}

	@Override
	public String toString() {
		return "This is a Singleton Instance.";
	}	
}

3. 双重检查加锁

to:

public class Singleton {

	
	private volatile static Singleton uniqueInstance;
	
	public static void main(String[] args) {
		Singleton aSingleton = Singleton.getInstance();
		System.out.println(aSingleton);
	}
	
	private Singleton(){}
	
	public static Singleton getInstance() {
		if ( uniqueInstance == null ){
			synchronized (Singleton.class) {
				if ( uniqueInstance == null ){
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}

	@Override
	public String toString() {
		return "This is a Singleton Instance.";
	}	
}

如果没有实例还没有创建,才进行同步,那么只有一次同步,就是在创建第一个的实例的时候。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值