• DCL_单例模式


    简介

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

    为什么使用单例模式:

    多个线程操作不同实例对象。多个线程要操作同一对象,要保证对象的唯一性

    优点:

    1、在内存里只有一个实例,减少了内存的开销

    2、避免对资源的多重占用

    单例模式的分类

    在对比每个模式通常往一下三个方面:线程的安全性、性能、懒加载(lazy )

    • 1.饿汉式:
    public class HungerySingleton {
        //加载的时候就产生的实例对象
        private static HungerySingleton instance=new HungerySingleton();
        private HungerySingleton(){
        }
    
        //返回实例对象
       public static HungerySingleton getInstance(){
            return instance;
       }
    
        public static void main(String[] args) {
            for (int i = 0; i < 20; i++) {
                new Thread(()->{
                    System.out.println(HungerySingleton.getInstance());
                }).start();
            }
        }
    }
    

    线程安全性:在加载的时候已经被实例化,所以只有这一次,线程安全的

    懒加载:没有延迟加载,好长时间不使用,影响性能

    性能:性能比较好

    • 2.懒汉式
    public class HoonSingleton {
        private static HoonSingleton instance=null;
        private HoonSingleton(){
        }
        public static HoonSingleton getInstance(){
            if(null==instance)
                instance=new HoonSingleton();
            return instance;
        }
    
        public static void main(String[] args) {
            for (int i = 0; i < 20; i++) {
                new Thread(()->{
                    System.out.println(HoonSingleton.getInstance());
                }).start();
            }
        }
    }
    

    线程安全:不能保证实例对象的唯一性,非线程安全

    懒加载:引发了一个不安全的问题,对于单例模式的应用有风险,而且风险比较大,,实现了懒加载

    性能:相对于饿汉式还是比较好的

    • 3.懒汉式+同步方法

    线程安全:是线程安全

    懒加载:是懒加载

    性能:+synchronized  退化到了串行执行

    • 4.Double-Check-Locking
    public class DCL {
        private static DCL instance=null;
        private DCL(){
        }
        public  static DCL getInstance(){
            if(null==instance)
                synchronized (DCL.class){
                   if(null==instance)
                        instance=new DCL();
                }
            return instance;
        }
    
        public static void main(String[] args) {
            for (int i = 0; i < 20; i++) {
                new Thread(()->{
                    System.out.println(DCL.getInstance());
                }).start();
            }
        }
    }

    性能比较好

    懒加载:实现了懒加载

    线程的安全性:保证了线程的安全

    • 5.Volatile+Double-check

    只需要加一段代码:

    private volatile static DCL instance=null;
    

    可以避免空指针异常

    • 6.Holder

    声明类的时候,成员变量中不声明实例变量,而放到内部静态类中

    public class HolderDemo {
        private HolderDemo(){
    
        }
        private static class Holder{
            private static HolderDemo instance=new HolderDemo();
        }
        //懒加载
        //synchronized
        //<init>
        public static HolderDemo getInstance(){
            return Holder.instance;
        }
    
        //广泛的一种单例模式
    }
    

      

    • 7.枚举
    public class EnumSingletonDemo {
        private EnumSingletonDemo(){
        }
        //延迟加载
        private enum EnumHolder{
            INSTANCE;
            private static  EnumSingletonDemo instance=null;
    
            private EnumSingletonDemo getInstance(){
                instance=new EnumSingletonDemo();
                return instance;
            }
        }//懒加载
        public static EnumSingletonDemo  getInstance(){
            return EnumHolder.INSTANCE.instance;
        }
    
    }
    

      

  • 相关阅读:
    demo12-回到顶部
    demo11-友情链接
    demo10-超链接标签
    demo09-程序员练习
    demo08-图片标签
    demo07-盒子标签
    demo06-字体标签
    demo05-换行标签
    转&nbsp;j2ee&nbsp;.线程池.对象池,连接池
    几种开源Java&nbsp;Web容器线程池…
  • 原文地址:https://www.cnblogs.com/grow001/p/12244082.html
Copyright © 2020-2023  润新知