java单例模式的整理

单例模式是开发中常用的模式,同时也是面试中设计模式里出现最频繁的一个。最近找工作梳理知识点,将自己的理解整理如下,如有错误愿虚心请教~

首先单例模式的目的就是系统中某个组件可能只需要一个,并且仅需要一个,如果这种组件出现多个的话可能造成系统的混乱,那么这时就需要一个单例来保证“单例”只会有一个。

单例模式:确保一个类只有一个实例,并提供一个全局的访问点。【head first】

下面介绍几种单例的设计方式:

1,“急切”的创建实例

public class Singleton {

	private static final Singleton uniqueInstance = new Singleton();
	
	private Singleton(){};
	
	public static Singleton getInstance(){
		return uniqueInstance;
	}
}

这种方式就是直接在类初始化的时候就将单例对象进行实例化,需要获取单例对象的都需要调用getInstance()方法。这就要求这样的单例对象不会占用太对的系统空间,并且系统空间允许这样的对象在一开始就进行实例化。但这个方式有一个明显的缺点就是:java中经常遇到序列化和反序列化,如果单纯使用这个Singleton会造成反序列化的时候产生多个单例对象。所以需要对这个方法进行优化。


2,“急切”的创建实例-优化01

public class Singleton implements Serializable{

	private static final Singleton uniqueInstance = new Singleton();
	
	private Singleton(){};
	
	public static Singleton getInstance(){
		return uniqueInstance;
	}
	//为了防止反序列化时产生多个实例对象,导致假冒的单例
	private Object readResolve(){
		return uniqueInstance;
	}
}
这样的代码实现就可以避免1中出现的序列化的问题。同样的在Effective Java中也有提到过jdk 1.5中的枚举类已经提供了序列化机制,绝对防止多次实例化。

public enum Singleton implements Serializable{
	INSTANCE;
	private String field;

	public String getField() {
		return field;
	}

	public void setField(String field) {
		this.field = field;
	}
}
这是实现单例模式最优的方式


3,同时实现单例模式还有慢实例化,代码如下,这种方式应注意线程安全。
public class Singleton {

	private static Singleton uniqueInstance;
	
	private Singleton(){};
	
	//第一种方式
	public static synchronized Singleton getInstance(){
		
		if(uniqueInstance == null){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
	
}

//双重检查加锁
public class Singleton3 {
	
	private volatile static Singleton3 uniqueInstance;
	
	private Singleton3(){};
	
	public static Singleton3 getInstance(){
		
		if(uniqueInstance == null){
			synchronized(Singleton3.class){
				if(uniqueInstance == null)
					uniqueInstance = new Singleton3();
			}
		}
		return uniqueInstance;
	}
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值