概念:
JAVA中单例模式是一种常见的设计模式,单例模式的写法有不少种,这里主要介绍三种:懒汉式单例、饿汉式单例。单例模式有以下特色:
一、单例类只能有一个实例。
二、单例类必须本身建立本身的惟一实例。
三、单例类必须给全部其余对象提供这一实例。java
单例模式确保某个类只有一个实例,且自行实例化向整个系统提供这个实例。在系统中线程池、日志对象、打印机、公用方法等被设计成单例。归根结底就是单例模式确保不一致状态。设计模式
1、懒汉试单例安全
一、懒汉(线程不安全)多线程
package com.example.Controller; /** * Title:懒汉(线程不安全) * Author:Administrator * Time:2017/5/8 0008 */ public class Singleton { private static Singleton singleton; private Singleton(){} //懒汉(线程不安全) public static Singleton getInstance() { if (singleton == null){ singleton = new Singleton(); } return singleton; } }
二、懒汉(线程安全)性能
package com.example.Controller; /** * Title:懒汉(线程安全) * Author:Administrator * Time:2017/5/8 0008 */ public class Singleton { private static Singleton singleton; private Singleton(){} //懒汉(线程安全) public static synchronized Singleton getSingleton() { if (singleton == null){ singleton = new Singleton(); } return singleton; } }
三、双重检查锁定spa
package com.example.Controller; /** * Title:双重检查锁定 * Author:Administrator * Time:2017/5/8 0008 */ public class Singleton { private static Singleton singleton; private Singleton(){} //双重检查锁定 public static synchronized Singleton getSingleton() { if (singleton == null){ synchronized(Singleton.class){ if (singleton == null){ singleton = new Singleton(); } } } return singleton; } }
四、静态内部类建立懒汉(线程安全)线程
package com.example.Controller; /** * Title:静态内部类建立懒汉(线程安全) * Author:Administrator * Time:2017/5/8 0008 */ public class Singleton { //静态内部类建立懒汉(线程安全) private static class LazyHolder{ private static final Singleton INSTANCE = new Singleton(); } private Singleton(){} public static Singleton getInstance(){ return LazyHolder.INSTANCE; } }
这种比上面一、二、3都好一些,既实现了线程安全,又避免了同步带来的性能影响。设计
2、饿汉式单例日志
package com.example.Controller; /** * Title:饿汉(线程安全) * Author:Administrator * Time:2017/5/8 0008 */ public class Singleton { //饿汉(天生线程安全) private Singleton(){} private static final Singleton instance = new Singleton(); //静态工程方法 public static Singleton getInstance(){ return instance; } }
饿汉式在类初始化時就建立好了一个静态对象供系统使用,因此饿汉式天生就是线程安全的。code
3、枚举
public enum Singleton { INSTANCE; public void whateverMethod() { } }
它不只能避免多线程同步问题,并且还能防止反序列化从新建立新的对象,我的认为因为jdk1.5中才加入enum特性,用这种方式写难免让人感受生疏,在实际工做中,也不多看见有人这么写过。