单例模式(Singleton):
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
单例模式代码实现步骤:
1、将构造函数私有化。
2、在类中创建一个本类对象。
3、提供一个方法可以获取到该对象。
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()方法的时候都需要同步,影响性能。更好的方法是使用双重检查加锁机制。这种方法即能保证线程安全,又能够使性能不受太大影响。