JAVA设计模式-单例模式
JAVA设计模式-单例模式
走世界 发表于3个月前
JAVA设计模式-单例模式
  • 发表于 3个月前
  • 阅读 1
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 设计模式系列之单例模式

概念:
  JAVA中单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种:懒汉式单例、饿汉式单例。单例模式有如下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

   单例模式确保某个类只有一个实例,且自行实例化向整个系统提供这个实例。在系统中线程池、日志对象、打印机、公用方法等被设计成单例。归根结底就是单例模式确保不一致状态。

一、懒汉试单例

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;
    }
}

2、懒汉(线程安全)

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;
    }
}

3、双重检查锁定

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;
    }
}

4、静态内部类创建懒汉(线程安全)

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;
    }
}

这种比上面1、2、3都好一些,既实现了线程安全,又避免了同步带来的性能影响。

二、饿汉式单例

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;
    }
}

饿汉式在类初始化時就创建好了一个静态对象供系统使用,所以饿汉式天生就是线程安全的。

三、枚举

public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
} 

它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,个人认为由于jdk1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,也很少看见有人这么写过。

共有 人打赏支持
粉丝 2
博文 83
码字总数 76914
×
走世界
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: