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

    有时候有一些只允许有一个实例的类需要用单例模式实现

    1. 单例模式可以分为
    • 饿汉(很饥渴,有就吃,类加载时就创建对象)
    • 饱汉(不饥渴,饿了再吃,用到类实例时才创建对象)
    • 双重锁模式
    /**
     * 单例模式 饿汉模式
     * Created by wjj on 2021/1/3
     */
    public class Singleton {
        private Singleton(){}
    
        private static Singleton instance=new Singleton();//类加载时就创建实例
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    
    /**
     * 懒汉模式
     * Created by wjj on 2021/1/3
     */
    public class Singleton2 {
        private Singleton2() {
        }
    
        private static Singleton2 instance;
    
        public static Singleton2 getInstance() {//先判断有木有实例,没有在实例化
            if(instance==null)
                instance=new Singleton2();
            return instance;
        }
    }
    
    1. 懒汉与饿汉的比较
    • 体现在加载时间上不同:饿汉模式在类加载时就建对象,所以加载时比较慢,获取对象比较快;相反,懒汉模式在类加载时比较快,但是获取对象时比较慢
    • 体现在线程安全问题上:饿汉模式在类加载时建对象,所以是线程安全的,但是懒汉模式在并发时会造成线程不安全
      为了解决以上问题,我们可以引出第三种单例模式

    3.双重锁模式

    //在包含
    public class Singleton3 {
        public Singleton3() {
        }
        private static Singleton3 instance;
    
        public static Singleton3 getInstance() {
            if(instance==null){
                synchronized (Singleton.class){//通过加锁解决线程安全问题
                    if(instance==null)
                        instance=new Singleton3();
                }
            }
            return instance;
        }
    }
    

    饱汉模式的基础上加入了锁机制,解决了线程不安全的问题

  • 相关阅读:
    Unity3D启动报错的解决方案
    Unity3D引用dll打包发布的问题及解决
    轻量级C#网络通信组件StriveEngine —— C/S通信开源demo(附源码)
    k8s 各种网络方案
    网络模型
    管理和安装 chart
    开发自己的 chart
    再次实践 MySQL chart
    chart 模板
    chart 目录结构
  • 原文地址:https://www.cnblogs.com/wjune-0405/p/14226981.html
Copyright © 2011-2022 走看看