几种常见单例的写法和问题

本文深入探讨单例模式的原理及应用,包括为何使用单例、单例与static的区别、懒汉与饿汉模式,以及四种单例实现方式:饿汉式、懒汉式、静态内部类和双层锁。每种实现都有详细的代码示例。

1.为什么用单例?

 简单来说就是全局共享一个对象,如果某对象初始化很麻烦也推荐用单例,只有一个情况下好管理,什么配置类,Util包一般情况下最好都是单例

2.单例跟static关系

两者有点像,static从理解是确实是“单例”,但是根本所处JVM区域不同,static只能在静态方法区,单例对象还可以再堆里,spring容器常见吧,这不就是一个最好的单例,JVM调优调的也主要是堆,静态区以后少用。

3.懒汉饿汉

当做一种思维来理解

4.单例实现

一定要保证私有构造,我看网上很多人忘了写这个,不私有构造,怎么成单例?

是不是final也无所谓吧,我觉得加跟不加都行。

5.双层锁单例的实现

最外层的if是减少可能排队的线程,貌似不加也行?不加的话可能会有更多的线程阻塞到里面。

中间那层锁是阻塞线程用的,目的是让线程一个一个去创建。

里面那层实际上比较重要,因为阻塞的线程可能是多个,没有这个判断里面的线程刚释放锁,外面的就立刻又创建一个了造成多次初始化会浪费。

//饿汉式
class SingleA {
    public static SingleA singleA = new SingleA();

    public static SingleA getSingle(){
        return singleA;
    }

    private SingleA() {
    }
}

//懒汉式
class SingleB{
    public static SingleB singleB = null;
    public static synchronized SingleB getSingleB(){
        if(singleB==null){
            singleB=new SingleB();
        }
        return singleB;
    }

    private SingleB() {
    }
}

//静态内部类
class SingleC{
    public static class SingleCC{
        public static SingleCC singleCC=new SingleCC();
    }

    public static  SingleCC getSingelC(){
        return SingleCC.singleCC;
    }

    private SingleC(){

    }
}

//双层锁
class SingleD{
    public static SingleD singleD = null;

    public static SingleD getSingleD(){
        if (singleD==null){
            synchronized ("lock"){
                if (singleD==null){
                    singleD=new SingleD();
                }
            }
        }
        return singleD;
    }

    private SingleD(){

    }
}

class SingleE{
    enum Color{
        Name("颜色");
        private String name;

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        Color(String name) {
            this.name = name;
        }
    }

    public static void main(String[] args) {
        
    }
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值