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

    第一个单例模式

    public class SingleObject {
     
       //创建 SingleObject 的一个对象
       private static SingleObject instance = new SingleObject();
     
       //让构造函数为 private,这样该类就不会被实例化
       private SingleObject(){}
     
       //获取唯一可用的对象
       public static SingleObject getInstance(){
          return instance;
       }
     
       public void showMessage(){
          System.out.println("Hello World!");
       }
    }

    获取对象

    class SingletonPatternDemo {
        public static void main(String[] args) {
    
            //不合法的构造函数
            //编译时错误:构造函数 SingleObject() 是不可见的
            //SingleObject object = new SingleObject();
    
            //获取唯一可用的对象
            SingleObject object = SingleObject.getInstance();
    
            //显示消息
            object.showMessage();
        }
    }
    

    执行程序,输出结果:

    Hello World!


    单例模式的几种实现方式

    懒汉式

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

      

    饿汉式

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

      

    这两种是基本的单例实现

    这时候我们要考虑线程安全问题,懒汉式是非线程安全的,可以在其获取对象的方法上增加synchornized,使其变成线程安全的,但是这样做有些影响效率,所以我们引入双检锁机制,

    代码如下:

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

      

    这样效率也能大大提升

    问题来了,小伙伴们

    为什么要使用单例模式哪?

  • 相关阅读:
    白话机器学习的数学笔记系列1算法回归_一元回归+多项式回归
    使用verdaccio搭建npm私有库 pm2守护进程 nrm管理npm源
    Nginx笔记
    FileSystemResource 和 ClassPathResource 以及 ServletContextResource 获取资源用法
    ClickHouse 使用
    springboot整合nacos项目配置文件
    SpringBoot基础篇Bean之条件注入@ConditionalOnExpression
    java web项目服务端返回json结果时过滤字段为null的属性
    Navicat导出Excel格式表结构
    sql积累
  • 原文地址:https://www.cnblogs.com/f-bob/p/14900489.html
Copyright © 2011-2022 走看看