首页 > 代码库 > 设计模式之单例模式

设计模式之单例模式

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:

1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。

2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

单例模式的实现一般分类饿汉式和懒汉式两种。下面分别介绍:

一.懒汉式

懒汉式是说类在初始化的时候并不创建类的实例,而是在第一次加载的时候才创建。

 1 //懒汉式单例类.在第一次调用的时候实例化自己    2 public class Singleton {   3     //私有化构造方法 4     private Singleton() {}   5     private static Singleton single=null;   6     //静态工厂方法    7     public static Singleton getInstance() {   8          if (single == null) {     9              single = new Singleton();  10          }    11         return single;  12     }  13 } 

这个类可以满足基本要求,但是,像这样毫无线程安全保护的类,如果我们把它放入多线程的环境下,肯定就会出现问题了,如何解决?

为了保证多线程环境下的线程安全,我们一般有如下几种方式:

1.在getInstance()方法上加同步

1 public static synchronized Singleton getInstance() {  2          if (single == null) {    3              single = new Singleton();  4          }    5         return single;  6 } 

这样是可以保证线程安全的,但是,synchronized关键字锁住的是这个对象,这样的用法,在性能上会有所下降,因为每次调用getInstance(),都要对对象上锁,事实上,只有在第一次创建对象的时候需要加锁,之后就不需要了,所以,这个地方需要改进。

2.双重检查锁定

public static Singleton getInstance() {          if (single == null) {                synchronized (single) {                   if (single == null) {                      single = new Singleton();                  }                }            }            return single;       }  

3.静态内部类

1 public class Singleton {    2     private static class LazyHolder {    3        private static final Singleton INSTANCE = new Singleton();    4     }    5     private Singleton (){}    6     public static final Singleton getInstance() {    7        return LazyHolder.INSTANCE;    8     }    9 } 

这种方式比前2种方式都好,既保证了线程安全,有提升了系统的性能。

二.饿汉式

1 //饿汉式单例类.在类初始化时,已经自行实例化   2 public class Singleton {  3     private Singleton() {}  4     private static final Singleton single = new Singleton();  5     //静态工厂方法   6     public static Singleton getInstance() {  7         return single;  8     }  9 }  

饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

 

设计模式之单例模式