Java单例模式的几种写法

首先,介绍下单例模式 的基本构成:

1)私有的静态成员变量;

2)私有构造器;

3)公共静态方法返回成员变量实例;

1、一般写法(也就是所谓的饿汉式)

public class Singleton{
	private static Singleton instance = new Singleton();
	private Singleton(){
	}
	public static Singleton getInstance(){
		return instance;
	}
}
这是最简单的一种写法,线程安全,但为了避免有人进行如下操作,建议将成员变量设置为final。
Singleton s = Singleton.getInstance();
s = null;

2、延迟加载(也就是所谓的懒汉式)

public class Singleton{
	private static Singleton instance = null;
	private static Singleton(){
	}
	public static Singleton getInstance(){
		if(instance == null)
			instance = new Singleton();
		return instance;
	}
}
这种写法是线程不安全的,如果保证线程安全则可以引申出下一种写法

3、延迟加载(线程安全)

public class Singleton{
	private static Singleton instance = null;
	private static Singleton(){
	}
	public static synchronized Singleton getInstance(){
		if(instance == null)
			instance = new Singleton();
		return instance;
	}
}
这种写法是线程安全的,但在方法上用synchronized效率会相对较慢,可以改进为代码块实现
public class Singleton{
	private static Singleton instance = null;
	private static Object lock = new Object();
	private static Singleton(){
	}
	public static Singleton getInstance(){
		if(instance == null){
			synchronized(lock){
				instance = new Singleton();
			}
		}
		return instance;
	}
}
此外还有一种双重检测锁的形式
public class Singleton{
	private static Singleton instance = null;
	private static Object lock = new Object();
	private static Singleton(){
	}
	public static Singleton getInstance(){
		if(instance == null){
			synchronized(lock){
				if(instance == null)
					instance = new Singleton();
			}
		}
		return instance;
	}
}

4、静态内部类方式

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

这种方式是利用静态内部类的静态块为外部类的成员变量进行实例化,此种方式能够保证线程安全,同时又不会降低效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值