zoukankan      html  css  js  c++  java
  • 一些关于单例模式的备注;

    单例模式,是设计模式中常被问到的,【也是比较简单的】


    目前,需要掌握的有三中形式吧,【枚举】,【懒汉】,和【饿汉】;

    1,枚举,这一点要首先说,也是《effective java》推荐的,也是最简单的。

    /**
    * 我们可以通过EasySingleton.INSTANCE来访问实例,这比调用getInstance()方法简单多了。
    * 创建枚举默认就是线程安全的,所以不需要担心double checked locking,
    * 而且还能防止反序列化导致重新创建新的对象
    * @author goujy
    *
    */
    enum SingletonDemo4{
    instance;
    
    /**
    *这个方法可以删除,就是这里可以写其他方法。。
    *
    */

    public void otherMathdo(){

    }
    }

    就这样,就没了。。。。简单来说,就一句话,#编写一个单元素的 枚举类#,里面再写 其他的方法,就随意了。

    2,再讲懒汉,(之前一直分不清楚,一种方式是懒汉还是饿汉,:(  ),懒,我理解为 开始(默认)懒得new 出新对象,在使用的时候,才new 出新对象。

    懒汉不加锁,涉及到多线程安全,线程加锁二次check,[个人认为这个其实也够用了]。

    /**
     * 懒汉不加锁
     * @author goujy
     *
     */
    class SingletonDemo1 {
    
        private static SingletonDemo1 sd1 = null;
    
        private SingletonDemo1() {
    
        }
        
        public static SingletonDemo1 getInstance() {
            if (sd1 == null) {                    
                sd1 = new SingletonDemo1();    
            }
            return sd1;
        }
    
    }
    
    
    /**
     * 懒汉加锁2
     * @author goujy
     *
     */
    class SingletonDemo2 {
    
        private static SingletonDemo2 sd2 = null;
    
        private SingletonDemo2() {
    
        }
        
        public static SingletonDemo2 getInstance() {
            if (sd2 == null) {                        //Single Checked
                synchronized (SingletonDemo2.class) {
                    if (sd2 != null) {                //Double Checked
                        sd2 = new SingletonDemo2();
                    }
                }
            }
            return sd2;
        }
    
    }
    /**
     * 懒汉加锁3
     * @author goujy
     *
     */
    class SingletonDemo3{
        private volatile  static  SingletonDemo3 sd3 =null;
        
        private SingletonDemo3(){
            
        }
        
        public static SingletonDemo3 getInstance(){
            if(sd3==null){
                synchronized (SingletonDemo3.class) {
                    if(sd3==null){
                        sd3= new SingletonDemo3();
                    }
                }
            }
            return sd3;
        }
    }

    3,再讲 饿汉模式,饿汉(饿的直接创建,不懒的创建了),其实饿汉也分两种,一种是直接用方法getInstance(),一种直接以 public final 静态属性。

    /**
     * 单例模式
     * 饿汉隐藏属性,提供方法;
     * @author goujy
     * 
     */
    public class SingletonDemo {
    
        private SingletonDemo() {
    
        }
    
        private final static SingletonDemo sd = new SingletonDemo();
    
        public static SingletonDemo getInstance() {
            return sd;
        }
    }
    
    /**
     * 饿汉直接以属性的形式;
     * @author goujy
     *
     */
    class SingletonDemo0 {
    
        private SingletonDemo0() {
    
        }
    
        public final  static SingletonDemo0 sd = new SingletonDemo0();
    
    }

    主要的,基本就这几类。

    多想,多试
  • 相关阅读:
    王道训练营-C语言-1
    错排问题
    王道训练营-C语言-1
    图文处理 生成海报
    根据经纬度按距离排序
    vue总结
    docker+consul
    doker es
    知识库
    php笔记
  • 原文地址:https://www.cnblogs.com/junyi0120/p/5473768.html
Copyright © 2011-2022 走看看