JAVA设计模式-单例模式

概念:
  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特性,用这种方式写难免让人感受生疏,在实际工做中,也不多看见有人这么写过。

相关文章
相关标签/搜索