zoukankan      html  css  js  c++  java
  • 单例模式

    单例模式是一种创建型模式,保证一个类只有一个实例对象。

    场景:打印机,一个系统可存在多个打印任务,但只能有一个正在工作的任务;

              在Spring中创建的Bean实例默认都是单例模式存在的

    懒汉式:在类加载时不初始化

    1、懒汉式1,线程不安全

    public class SingletonDemo1 {
        private static SingletonDemo1 instance;
        private SingletonDemo1(){}
        public static SingletonDemo1 getInstance(){
            if (instance == null) {
                instance = new SingletonDemo1();
            }
            return instance;
        }
    }

    2、懒汉式2、线程安全、引入锁效率低

    public class SingletonDemo2 {
        private static SingletonDemo2 instance;
        private SingletonDemo2(){}
        public static synchronized SingletonDemo2 getInstance(){
            if (instance == null) {
                instance = new SingletonDemo2();
            }
            return instance;
        }
    }

    3、懒汉式、线程安全、效率高

    public class SingletonDemo3 {
        private volatile static SingletonDemo3 singletonDemo3;
        private SingletonDemo3(){}
        public static SingletonDemo3 getSingletonDemo3(){
            if (singletonDemo3 == null) {
                synchronized (SingletonDemo3.class) {
                    if (singletonDemo3 == null) {
                        singletonDemo3 = new SingletonDemo3();
                    }
                }
            }
            return singletonDemo3;
        }
    }

    饿汉式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。

    4、饿汉式

    public class SingletonDemo4 {
        private static SingletonDemo4 instance = new SingletonDemo4();
        private SingletonDemo4(){}
        public static SingletonDemo4 getInstance(){
            return instance;
        }
    }

    5、静态内部类

    public class SingletonDemo5 {
        private static class SingletonHolder{
            private static final SingletonDemo5 instance = new SingletonDemo5();
        }
        private SingletonDemo5(){}
        public static final SingletonDemo5 getInsatance(){
            return SingletonHolder.instance;
        }
    }

    在加载外部类的时候,并不会同时加载其静态内部类,只有在发生调用的时候才会进行加载,加载的时候就会创建单例实例并返回,有效实现了懒加载

    类级内部类结合多线程默认同步锁,同时实现延迟加载和线程安全。

    注:FelEngine创建对象比较耗时,选择使用懒汉式单例模式,避免重复创建对象提高效率。

  • 相关阅读:
    Codeforces 812E Sagheer and Apple Tree ——(阶梯博弈)
    2017年浙江省赛总结
    UVALive 3716 DNA Regions ——(扫描法)
    UVALive 3716 DNA Regions ——(式子变形)
    2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)
    Egyptian Collegiate Programming Contest (ECPC 2015) C题 Connecting Graph
    UVALive 4726 Average ——(斜率优化DP)
    CodeForces 494B Obsessive String ——(字符串DP+KMP)
    [BUUOJ记录] [极客大挑战 2019]RCE ME
    [BUUOJ记录] [GXYCTF2019]BabySQli
  • 原文地址:https://www.cnblogs.com/tilamisu007/p/9560168.html
Copyright © 2011-2022 走看看