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;
        }
    }
    

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

  • 相关阅读:
    未解
    HDU 4642 Fliping game 解题报告
    HDU 4639 Hehe 解题报告
    深入浅出Node.js (11)
    JS文本框获取焦点
    深入理解 BFC
    JS 中函数名后面加与不加括号的区别
    ES6 箭头函数
    sublime 格式化代码
    <!--more-->搭建的博客设置主页内容高度
  • 原文地址:https://www.cnblogs.com/wjune-0405/p/14226981.html
Copyright © 2011-2022 走看看