美文网首页经典设计模式-低调小熊猫
经典设计模式(二):单例模式

经典设计模式(二):单例模式

作者: 低调小熊猫 | 来源:发表于2018-11-23 09:54 被阅读0次

版权声明

最近很多爬虫来我博客爬文章,转载可以,但请保留原文出处及版权声明,即便是在中国

  • 本文作者:低调小熊猫
  • 本文链接:https://aodeng.cc/archives/dan-li-mo-shi
  • 版权声明:本文采用<a rel="license" href="http://creativecommons.org/licenses/by/4.0/">知识共享署名 4.0 国际许可协议</a>进行许可。转载-非商用-非衍生-保持署名,商业转载请联系作者本人qq:2696284032

单纯的广告

个人博客:https://aodeng.cc
微信公众号:低调小熊猫
QQ群:756796932

简介

单例模式确保一个类只有一个实例,并提供一个全局访问点,上班偷偷写的文章,所以请仔细看注释

使用

懒汉式

/**
 * @program:hope
 * @author:aodeng
 * @blog:低调小熊猫(https://aodeng.cc)
 * @微信公众号:低调小熊猫
 * @create:2018-11-15 13:20
 **/
public class SingleObject {
    /**===============懒汉式(那个取的名字,本人表示根本记不住)英文名,叫 lazy loading,也就是延迟加载===============**/
    private static SingleObject instance;
    /**让构造函数为 private,这样该类就不会被实例化**/
    private SingleObject(){}
    /**但是上面代码会有一个问题,当多个线程同时调用 getInstance() 方法时,可能会产生多个instance 实例,因此这种方式并不是真正的单例。
       为了解决线程安全问题,我们只需要在getInstance() 方法上使用synchronized 关键字给线程加锁即可
       synchronized 的作用是加锁,当多个线程同时调用getInstance() 时,只有一个线程能进入,其他线程会等待进入的线程出来之后在一一进入,
       这样就能保证instance 实例是唯一的。这才是真正的单例,不过这并不是完美的解决方案,只要是锁,必然有性能损耗问题。而且对于上面的代码,
       其实我们只需要在线程第一次访问时加锁即可,之后并不需要锁,锁给我们带来了系统资源浪费**/
    public static synchronized SingleObject getInstance(){
        if (null == instance){
            instance=new SingleObject();
        }
        return instance;
    }

    private String name="低调小熊猫";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

饿汉式

/**
 * @program:hope
 * @author:aodeng
 * @blog:低调小熊猫(https://aodeng.cc)
 * @微信公众号:低调小熊猫
 * @create:2018-11-15 13:34
 **/
public class SingleObject2 {
    /**=======饿汉式(低调小熊猫表示还是记不住)新的解决方案是not lazy loading,在类加载时就创建好了实例,解决懒汉式锁给我们带来了系统资源浪费===============**/
    private static SingleObject2 instance=new SingleObject2();
    private SingleObject2(){}
    public static SingleObject2 getInstance(){
        return instance;
    }
    /**这种方式就可以保证实例唯一了**/
    private String name="低调小熊猫2";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

double-checked locking (双重检查加锁)

/**
 * @program:hope
 * @author:aodeng
 * @blog:低调小熊猫(https://aodeng.cc)
 * @微信公众号:低调小熊猫
 * @create:2018-11-15 13:45
 **/
public class SingleObject3 {
    /**=======还有一种叫 double-checked locking (双重检查加锁)==============**/
    /**这种方式主要用到两个关键字volatile 和 synchronized,synchronized 的作用是加锁,就不再多说,而volatile 关键字许多人不了解,没关系,我们先看代码**/
    private volatile static SingleObject3 instance;
    private SingleObject3(){}
    private static SingleObject3 getInstance(){
        if (null == instance) {
            synchronized (SingleObject3.class){
                if (null == instance){
                    instance =new SingleObject3();
                }
            }
        }
        return instance;
    }
    /**volatile 关键字简单来说就是可以保证instance变量在被其中一个线程new出来时,其他线程可以立即看到结果并正确的处理它。对volatile 有兴趣的朋友可以自行度娘
     * 这种方式的单例模式可以大大的减少锁所带来的性能损耗**/
    private String name="低调小熊猫3";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

TestMain

/**
 * @program:hope
 * @author:aodeng
 * @blog:低调小熊猫(https://aodeng.cc)
 * @微信公众号:低调小熊猫
 * @create:2018-11-15 13:23
 **/
public class TestMain {
    public static void main(String[] args) {
        /**======单例使用========**/
        //懒汉式
        SingleObject singleObject=SingleObject.getInstance();
        //饿汉式
        SingleObject2 singleObject2=SingleObject2.getInstance();
        //双重检查加锁,额,是不是很尴尬,我不知道怎么用这个
        //SingleObject3 singleObject3=SingleObject3.
        System.out.println(singleObject.getName());
        System.out.println(singleObject2.getName());
        /**
         * 优点
         使用单例模式,对象在内存中只有一个实例,并且无需频繁的创建和销毁对象,大大的减少了性能的损耗
         缺点:懒得打字了,可以忽略
         个人喜欢使用饿汉式单例,也就是not lazy loading,没有为什么,就是这种代码少点,嘿嘿
         **/
    }
}

源码链接

https://github.com/java-aodeng/hope

相关文章

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式系列教程之单例模式-原理介绍

    设计模式系列教程之单例模式-原理介绍 一:单例模式(Singleton)学习步骤 经典的单例模式原理: 本文出处:...

  • 设计模式分类

    经典23种设计模式: 创建型设计模式: Singleton Pattern(单例模式) PrototypePatt...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • C++单例模式的实现分析

    单例模式 什么是单例模式?我就不多做赘述了。移步至百度百科单例模式。 什么时候使用单例? 单例模式是一个经典的设计...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • Python 面向对象7: 单例模式

    一、内容 1.1、单例设计模式 1.2、__new__方法 1.3、Python 中的单例 二、单例设计模式 2....

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

网友评论

    本文标题:经典设计模式(二):单例模式

    本文链接:https://www.haomeiwen.com/subject/robdqqtx.html