JAVA 设计模式之单例模式

JAVA 设计模式之单例模式有以下几种:懒汉式、饿汉式,双重检查,静态内部类等,其中主要区别是看能不能传参,以及线程安全不安全。

1、懒汉式,不能传参,线程不安全。

public class Singleton {
    private static final Singleton ourInstance = new Singleton();

    public static Singleton getInstance() {
        return ourInstance;
    }
    private Singleton() {
    }
}
2、 饿汉式,能传参,线程不安全。

public class Singleton {
    private static  Singleton ourInstance ;

    public static Singleton getInstance() {
        if (ourInstance == null) {
            ourInstance = new Singleton();
        }
        return ourInstance;
    }
    private Singleton() {
    }
}

3、双重检查,能传参,线程安全。可使用volatile关键字,一保证了不同线程对这个变量进行操作时的可见性,

即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的;二禁止进行指令重排序。

public class Singleton {
    //线程并发时,当变量被改动了,所有的线程都能即时访问到最新的数据
    //会屏蔽掉虚拟机的一些代码优化
    private volatile static Singleton ourInstance ;

    public static Singleton getInstance() {
        if (ourInstance == null) {
            synchronized (Singleton.class){
                if (ourInstance == null) {
                    ourInstance = new Singleton();
                }
            }
        }
        return ourInstance;
    }
    private Singleton() {
    }
}

4、静态内部类,不能传参,线程安全。

//可以延迟加载,也能线程安全

public class Singleton {
    private Singleton() {
    }
    private static class SingletonHolder{
        //静态内部类的静态属性实例化时,由JVM保证线程的安全
        private static Singleton instance = new Singleton();

    }
    //只有调用了getInstance方法之后,才会实例化Singleton instance属性
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}
5 、单例扩展,用于对象池。

public class Connection {
    private static int max = 5;
    private static Map<Integer,Connection> map = new HashMap<Integer,Connection>();
    private static int key = 1;
    public static Connection getConnection(){
        Connection instance = map.get(key);
        if (instance == null){
            instance = new Connection();
            map.put(key,instance);
        }
        key++;
        if (key>max){
            key=1;
        }
        return instance;
    }
}
调用 :Connection.getConnection()

6 其他 枚举,Java中很少用。

public enum MyEnum {
    // a ,b,c,d
    RED(1,"red"),BLUE(2,"BLUE");
    private int index;
    private String name;
    MyEnum(int index,String name){
        this.index=index;
        this.name=name;
    }
    public int getIndex(){
        return index;
    }
    public String getName(){
        return name;
    }
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值