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

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) {
        
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章