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

    public class Singleton {

      private Singleton(){

      }

      private static final Singleton singleton = new Singleton();

      public static Singleton getInstance(){
        return singleton;
      }
    }

    饿汉模式:优点(线程安全),缺点(项目启动会加载静态对象,占用内存空间)

    public class Singleton {
        
        private Singleton(){
            
        }
        
        private volatile static Singleton singleton = null;
        
        public static Singleton getInstance(){
            if(singleton == null){
                synchronized (Singleton.class) {
                    if(singleton==null){
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
            
    }

    懒汉模式+双重检查锁

    优点:线程安全,调用getInstance之后才会实例化

    缺点:使用synchronized解决了线程不安全的问题,但是也造成同时只能有一个线程调用 getInstance,效率低,而synchronized只是保证了第一次实例化不会出现线程不安全的问题。

    public class Singleton {
        
        private Singleton(){
            if(Singleton.getInstance()==null){
                throw new IllegalStateException();
            }
        }
        
        public static Singleton getInstance(){
            return lazyHolder.singleton;
        }
            
        private static class lazyHolder{
            private static final Singleton singleton = new Singleton();
        }
    }

    静态内部类

    • 反射能否打破单例?

      首先,对外部类的私有构造器中加入 instance==null 的判断,防止反射入侵外部类。

      其次,静态内部类保证了从外部很难获取 SingletonHolder 的 Class 对象,从而保证了内部类不会被反射。

    • 多线程能否打破单例?

      Holder 模式借用了饿汉模式的优势,就是在加载类(内部类)的同时对 instance 对象进行初始化。

      由于自始至终类只会加载一次,所以即使在多线程的情况下,也能够保持单例的性质。

    • 优势?劣势?

      优势:兼顾了懒汉模式的内存优化(使用时才初始化)以及饿汉模式的安全性(不会被反射入侵)。

      劣势:需要多加载一个类;相比于懒汉模式,Holder 创建的单例,只能通过 JVM 去控制器生命周期,不能手动 destroy

    参考:https://www.cnblogs.com/jing-an-feng-shao/p/7501576.html

  • 相关阅读:
    C#处理JPEG头信息
    利用WebSocket传输数组或者Blob的方案
    System.Collections命名空间下的所有接口及结构图
    C#生成影像金字塔
    C# DEM数据转换为JPEG
    C# 数值型数据转换为字节数组
    c语言实现bitmap的基本操作
    大数据spark 视频的免费连接
    Android开源应用【转】
    linux c程序中获取shell脚本输出 [转]
  • 原文地址:https://www.cnblogs.com/linbky/p/11430883.html
Copyright © 2011-2022 走看看