标签:
单例模式是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销;
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力;
3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。
说到单例,就必须说下懒汉式和饿汉式。先上代码:
懒汉式:
public class Singleton { /** 私有构造方法,防止被实例化 */ private Singleton() {} /** 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */ private static Singleton instance = null; /** 静态工程方法,创建实例 */ public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
饿汉式:
public class Singleton1 { /** 私有构造方法,防止被实例化 */ private Singleton1() {} /** 已经创建好一个静态的对象供系统使用 */ private static Singleton1 instance = new Singleton1(); /** 静态工程方法,创建实例 */ public static Singleton1 getInstance() { return instance; } }
从上可以看出,懒汉式为线程不安全的、饿汉式是线程安全的。饿汉式虽然是线程安全,但是不管是否使用到此类,都先进行了创建,有点浪费内存之嫌。对此,我们再对懒汉式进行优化,处理线程安全问题,代码如下:
懒汉式线程安全优化:
public synchronized static Singleton3 getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }
但是,synchronized关键字锁住的是这个对象,这样的用法,在性能上会有所下降,因为每次调用getInstance(),都要对对象上锁,事实上,只有在第一次创建对象的时候需要加锁,之后就不需要了,所以,这个地方需要改进。我们改成下面这个:
public static Singleton3 getInstance() { if (instance == null) { synchronized (instance) { if(instance == null){ instance = new Singleton3(); } } } return instance; }
改编于,如需看原文请点击:http://blog.csdn.net/zhangerqing/article/details/8194653
标签:
原文地址:http://www.cnblogs.com/xxr2015/p/4626452.html