• Java设计模式(一)——单例模式


    简介

    定义: 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。

    单例类拥有一个私有构造函数,确保用户无法通过 new 来直接实例化它。类中包含一个静态私有成员变量与静态公有的工厂方法,该方法负责检验实例的存在性,如果不存在久实例化自己,然后存储在静态成员变量中,确保只有一个实例类被创建。

    • 饿汉模式:在类被加载的时候将自己实例化,无需考虑多线程并发冲突的问题。初始化加载的时间可能会较长。优点是线程安全,执行效率高;缺点是浪费内存,容易产生垃圾。
    • 懒汉模式:类在第一次使用的时候创建,需要通过双重检查锁定等机制防止多线程冲突,导致系统性能降低。优点是不浪费内存,缺点是需要保证线程安全,效率低一点。

    双重检查锁存在问题: 当第一个判断得到不为null的时候,对象可能还没有完成初始化。对象的初始化和内存地址分配可能会被重排序,所以讲instance声明为volatile就不会发生重排序《Java并发编程的艺术》

    代码

    public class SingletonEH {
        private static SingletonEH instance = new SingletonEH();
        private SingletonEH (){}
        public static SingletonEH getInstance() {
            System.out.println("instance:"+instance);
            System.out.println("加载饿汉式....");
            return instance;
        }
    }
    
    public class SingletonLHsyn {
        private volatile static SingletonLHsyn instance;
        private SingletonLHsyn (){
    		System.out.println("加载懒汉式....");
    	}
    
        public static SingletonLHsyn getInstance() {
            if (instance == null) {
    	        synchronized(SingletonLHsyn.class) {
    		        if (instance == null) {
    				    instance = new SingletonLHsyn();
    		        }
    		    }
            }
            return instance;
        }
    }
    
  • 相关阅读:
    Kafka(Go)系列(一)通过dockercompose 安装 Kafka
    grpc通过自签CA证书、server、client双向认证【支持go1.15】
    Go 基准测试和性能测试学习使用
    Debian关闭防火墙
    服务依赖开闭简单算法
    Hbase 和 Hive 的区别,各自使用场景。
    VMware虚拟机 Ubuntu1404
    安装protoc
    Redis大 key 自动过期的问题
    MySQL设置数据库为只读
  • 原文地址:https://www.cnblogs.com/lippon/p/14117602.html
Copyright © 2020-2023  润新知