• Java6种单例模式写法


    单例模式

    某个类任何情况下只有一个实例,并提供一个全局访问点来获取该实例。
    
    Java6种单例模式:2种懒汉式,2种饿汉式 ,静态内部类 ,枚举类
    
    • 1
    • 2
    • 3

    懒汉式

    synchronized+延迟加载

    public class Singleton {
        private static Singleton instance;
        private Singleton(){}
    
        public static synchronized Singleton getInstance(){ //synchronized锁住getInstance方法
            if (instance==null) {  //延迟加载
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    volatile+synchronized双检锁

    public class Singleton {
        private volatile static Singleton instance; //volatile修饰实例
        private Singleton(){}
    
        public static  Singleton getInstance(){
            if (instance==null) {
                synchronized(Singleton.class){   //synchronized锁住Singleton对象
                    if (instance==null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    饿汉式—类加载时触发实例化,避免了多线程同步问题

    类加载时初始化静态实例

    public class Singleton {
        private static Singleton instance = new Singleton(); //类加载时初始化静态实例
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
            return instance; //直接返回加载好的静态实例
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在静态代码块里初始化实例

    public class Singleton {
        private static Singleton instance = null;  
    
        static{                             
            instance = new Singleton();  //在静态代码块里初始化实例
        }
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
    
            return instance;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    静态内部类方式—实现了延迟加载

    调用静态内部类时,在静态内部类里初始化实例

    public class Singleton {
    
        //定义静态内部类
        private static class InnerSingleton {
            private static final Singleton INSTANCE = new Singleton(); //初始化完成Singleton类静态实例
        }
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
    
            return InnerSingleton.INSTANCE; //返回静态内部类里的静态实例
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    枚举类方式–既能避免多线程同步问题,又能防止反序列化重新创建对象

    创建一个枚举,枚举成员为INSTANCE。使用枚举类.INSTANCE即可获取实例

    package acc;
    
    public enum Singleton {
    
        INSTANCE; //定义1个唯一的成员INSTANCE
    
        //枚举类里的公共方法
        public  void  doSomething() {
            System.out.println("r2323t23");
        }
    }
    
    public class TestSingleton {
        public static void main(String[] args) {
            //使用枚举类.INSTANCE即可获取实例
            Singleton.INSTANCE.doSomething();
        }
    }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    高效节能双冷源空调架构在某新建数据中心项目中的应用
    DBCO-PEG-OPSS/OPSS-PEG-DBCO/二苯并环辛炔聚乙二醇修饰邻吡啶二硫
    外包干了2个月,技术退步明显.......
    一、Clion和STM32CubeMx---点亮LED(案例程序)
    R语言表与因子(详细知识点,深入知识点后续会补充!)
    qiankun 乾坤主应用访问微应用css静态图片资源报404
    知乎热议的 Java 面试成神笔记,下载量已过90k,面试神技.exe进程已启动
    python如何创建自己的对冲交易算法
    Docker-安装(Linux,Windows)
    javaScript 使用indexOf 撸一下模糊查询
  • 原文地址:https://blog.csdn.net/ThinkPet/article/details/134300603