单例设计模式之个人见解

    单例模式(Singleton):


单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

单例模式代码实现步骤:

1、将构造函数私有化。
2、在类中创建一个本类对象。
3、提供一个方法可以获取到该对象。
(对于事物怎么描述,还怎么描述。当需要将该事物的对象保证内存唯一时,将以上三部加上。)
Class SingLeton{
//构造私有化
private SingLeton(){}
//创建实例
private static SingLeton instance = new SingLetion();
//获取实例的方法
public static SingLetion getInstance(){
return instance;
}
}

单例设计模式的特点:


1、为了避免其他程序过多建立该类对象。先禁止其他程序建立该对象。
2、还为了让其他程序可以访问到该类对象,只好自本类中,自定义一个对象。
3、为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

单例设计模式两种实现方法:


1、饿汉式
Class SingLeton{
//私有化构造方法,好在内部控制创建实例的数目
private SingLeton(){}
//定义一个变量来存储创建好的类实例,只会创建一次
private static Singleton instance = new Singleton();
//定义一个方法提供类的实例
public static Singleton getInstance(){
return instance;
}
}
2 、懒汉式
Class SingLeton{
//私有化构造方法,好在内部控制创建实例的数目
private SingLeton(){}
//定义一个变量来存储创建好的类实例,只会创建一次
private static Singleton instance = null;
//定义一个方法提供类的实例,为了保证线程安全安全需要加synchronized
public static synchronized Singleton getInstance(){
//判断是否为空
if(instance==null){
//创建一个实例
instance = new Singleton();
}
return instance;
}
}


 
线程安全: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。


两种模式的比较:

时间和空间:
懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直不使用实例,那就不会创建实例,从而节约了内存空间。饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,不用进行判断,直接返回类实例即可,节约了运行时间。
安全性:
从线程安全上来讲,不加同步的懒汉式是线程不安全的,懒汉式实现就是线程不安全的。饿汉式是线程安全的,因为虚拟机保证只装载一次,在装载类的时候是不会发生并发的。那么如何实现懒汉式的线程安全呢?只需要加上synchronized 关键字即可,但是这种写法有一个弊端,那就是每次调用这个getInstance()方法的时候都需要同步,影响性能。更好的方法是使用双重检查加锁机制。这种方法即能保证线程安全,又能够使性能不受太大影响。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值