• 单利模式(饿汉模式,懒汉模式)线程安全与解决问题


    单例模式

    1.饿汉模式:在类被加载的时候创建实例(线程安全的)

    2.懒汉模式:在方法被运行的时候创建实例(线程不安全的) 解决方法:通过双检验

    饿汉模式:

    public class Singleton {
        //饿汉模式
        //将构造函数私有化
        private Singleton(){
    
        }
        //将对象实例化
        private static Singleton instance = new Singleton();
    
        //得到实例的方法
    
        public static Singleton getInstance() {
            return instance;
        }
    }

    懒汉模式:

    //懒汉模式
        //将构造函数私有化
        private Singleton(){
    
        }
        //将对象实例化
        private static Singleton instance ;
    
        //得到实例的方法
    
        public static Singleton getInstance() {
           if(instance == null){
               instance = new Singleton();
           }
            return instance;
        }

    解决方法1(慢)

    //得到实例的方法
    
        synchronized public static Singleton getInstance() {
           if(instance == null){
               instance = new Singleton();
           }
            return instance;
        }

    解决方法2(慢)

     //得到实例的方法
    
         public static Singleton getInstance() {
          synchronized (Singleton.class){
              if(instance == null){
                  instance = new Singleton();
              }
              return instance;
          }
        }

    解决方法3(推荐)

    原因:如果实例已经存在,就不存在线程安全的问题,可以直接获取实例,减少了加锁而造成的速度问题。

    public class Singleton {
        //懒汉模式
        //将构造函数私有化
        private Singleton(){
    
        }
        //将对象实例化
        private static volatile  Singleton instance ;
    
        //得到实例的方法
    
         public static Singleton getInstance() {
             if(instance == null) {
                 synchronized (Singleton.class) {
                     if (instance == null) {
                         instance = new Singleton();
                     }
                 }
             }
             return instance;
        }
    }

    volatile 关键字

  • 相关阅读:
    使用JAVA API 解析ORC File
    spark Graph 的PregelAPI 理解和使用
    流程图引擎
    JMX
    Spring走向注解驱动编程
    java@ 注解原理与使用
    Maven打包SpringBoot
    Java根据实体快速生成对象
    VBA基础出发
    “嗝嗝老师”
  • 原文地址:https://www.cnblogs.com/da-peng/p/8278714.html
Copyright © 2020-2023  润新知