单例模式

单例模式,顾名思义,一个类最多只能有一个实例。

有几种方式的单例实现方式,下面开门见山,上代码。

懒汉单例

懒汉很懒,在你要调用获得对象实例的方法时候才创建。

public class LazySingleton {
private static LazySingleton lazy;
private LazySingleton(){}
public static LazySingleton getInstance(){
	if(lazy==null){lazy=new LazySingleton();}
	return lazy;
}
}


饿汉单例

饿汉很饿,类中第一句就迫不及待的要创建对象来填肚子。

public class HungrySingleton {
private static  final HungrySingleton hungry=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
	return hungry;
}
}

以上两个单例类比较简单,但是存在一些问题:①对于懒汉单例类,当程序执行到创建对象语句,但对象还未被创建好的时候,如果此时再次调用getInstance()方法,此时!=null判断结果仍然为true,如此便导致了单例类”不单了“。可以用Synchronized关键字修饰方法getInstance()来实现同步解决这个问题。

②饿汉模式比较奢侈,因为存在不需要实例的情况,在这种情况下它的创建就显得多余。

--------------------------------下面补充两个懒汉模式的实现-------------------------------------

public class LazySingleton {
	private static LazySingleton lazy;

	private LazySingleton() {
	}

	public static LazySingleton getInstance() {
		if (lazy == null) {
			synchronized (LazySingleton.class) {
				lazy = new LazySingleton();
			}
		}
		return lazy;
	}
}
比synchronized整个方法开销小一些,但存在同步问题,改进如下----》

public class LazySingleton {
	private static LazySingleton lazy;

	private LazySingleton() {
	}

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

这个叫 双重检查锁定。

-----------------------------------------------------------------------------------------------------------------------------------------------

不知有没有发现以上的类成员变量都定义成了static,这是为什么呢?这要从头说起,因为单例类没有实例,所以获得实例的方法必须是static(这样才能不创建实例调用该方法)。又因为static方法只能操作static成员,所以类成员变量都定义成了static。(直接return new ()除外)






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值