JAVA---单例模式

单例模式

单例的目的是保证某个类仅有一个实例。当有某些类创建对象内存开销较大时可以考虑使用该模式。单例模式又分为 饿汉式 和 懒汉式。

1.饿汉式(线程安全)

饿汉式。顾名思义,该模式在类被加载时就会实例化一个对象。

该模式能简单快速的创建一个单例对象,而且是线程安全的(只在类加载时才会初始化,以后都不会)。但它有一个缺点,就是不管你要不要都会直接创建一个对象,会消耗一定的性能

//饿汉式
public class Hungry {
    private Hungry(){}
    private final static Hungry HUNGRY = new Hungry();
    public static Hungry getInstance(){
        return HUNGRY;
    }
}

2.懒汉式(线程不安全--需要加锁)

2.懒汉式。该模式只在你需要对象时才会生成单例对象(比如调用getInstance方法)但他不是线程安全的


//懒汉式
public class LazyMan {

    private LazyMan() {
        System.out.println(Thread.currentThread().getName() + "--ok");
    }

    private volatile static LazyMan lazyMan;//保证并发内存可见性,有序性,可以防止指令重排,但不能保证原子性

    public static LazyMan getInstance() {
        //双重检测锁模式 懒汉式单例 简称DCL
        if (lazyMan == null) {
            synchronized (LazyMan.class) {//synchronized保证并发内存可见性,有序性,原子性
                if (lazyMan == null) {
                    lazyMan = new LazyMan();//不是原子性操作,可能会造成指令重排
                }
            }
        }
        return lazyMan;
    }

    //单线程ok,多线程不行
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(LazyMan::getInstance).start();
        }

    }
}

3.静态内部类(线程安全)

public class Holder {
    private Holder() {

    }

    public static Holder getInstance() {
        return InnerClass.HOLDER;
    }

    public static class InnerClass {
        private static final Holder HOLDER = new Holder();
    }
}
posted @   学JAVA的旅行者  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示