设计模式之单例模式

单例对象(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 }  

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

原文地址:https://www.cnblogs.com/lixiuyu/p/5911452.html