详解java设计模式(一)之单例模式(创建型)

单例模式是在日常程序开发中经常使用的设计模式,一般用来受限资源的访问上,如数据库连接池,系统管理器,驱动程序等,通常都是单例模式。

单例模式的实现方式有多种,但在日常开发中常用的主要有:饿汉式,懒汉式。

      单例模式通常具有如下特点:

      1)单例类只能有一个实例。
  2)单例类必须自己创建自己的唯一实例。
  3)单例类必须给所有其他对象提供这一实例。

单例模式的设计最重要的使得类的构造方法私有化,使得外部无法随便创建


一.饿汉式(这是新手总是优先想到的)

package designpattern;
public class Singleton {
//私有化构造函数,使得外部无法创建该类对象,只能通过特定接口访问
private Singleton(){};
private static final Singleton singleton=new Singleton();
public static Singleton getInstance(){
	return singleton;
}
}

这种单例设计的优点在于在类加载的时候就创建对象,使得对对象的访问变得线程安全,

缺点在于,不论有没有使用该类都进行内存加载,一旦这个对象没有使用,可能会导致内存浪费。


二.懒汉式

1.简单方式

package designpattern;
public class Singleton {
private Singleton(){};
private static  Singleton singleton=null;
public static Singleton getInstance(){
	if(singleton==null){
		singleton=new Singleton();
	}
	return singleton;
}
}
这种方式只是将对象的创建时机延迟到调用函数,但是这种方式在多线程环境下是不安全,可能会导致创建多个对象,出现不同步的问题。


2.用synchronized同步getInstance函数

package designpattern;
public class Singleton {
private Singleton(){};
private static  Singleton singleton=null;
public static synchronized Singleton getInstance(){
	if(singleton==null){
		singleton=new Singleton();
	}
	return singleton;
}
}
这种方式解决了第一种方式出现的线程安全的问题,但是没有调用该函数时都需要做同步操作,这导致消耗了很多资源,使得性能损耗。

3.双重检查锁定

package designpattern;
public class Singleton {
private Singleton(){};
private static  Singleton singleton=null;
public static  Singleton getInstance(){
	if(singleton==null){
		synchronized(Singleton.class){
			if(singleton==null)
			singleton=new Singleton();
		}

	}
	return singleton;
}
}
做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗。


4.静态内部类方式(推荐)

package designpattern;
public class Singleton {
private Singleton(){};
public static class LazySingleton{
	public static final Singleton singleton=new Singleton();
}
public static  Singleton getInstance(){
	return LazySingleton.singleton;
}
}
这种方式即不需要担心同步问题,同时也做到了延迟加载,我个人比较喜欢这种方式。


三.应用场景

当需要饿汉式加载时,则直接在类加载时创建单例对象,不存在线程同步问题。

当需要节约资源,延迟加载时,必须考虑在多线程环境下线程安全(多线程访问同一段代码时结果具有确定性)问题,还有性能损耗,所以当遇到这种需求时,我推荐使用静态内部类这种方式。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值