zoukankan      html  css  js  c++  java
  • 设计模式 Singleton 单例 懒汉,线程安全

            首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了,

    比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,

    这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,

    即在整个的打印过程中我只有一个打印程序的实例。

    简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,

    任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。

     

    public class SingletonClass {
    
      private static SingletonClass instance = null;
        
      public static SingletonClass getInstance() {
        if(instance == null) {
          instance = new SingletonClass();
        }
        return instance;
      }
        
      private SingletonClass() {
        
      }
        
    }

    同步:


    上面的代码很清楚,也很简单。然而就像那句名言:“80%的错误都是由20%代码优化引起的”。单线程下,这段代码没有什么问题,可是如果是多线程,麻烦就来了。我们来分析一下:
     
    线程A希望使用SingletonClass,调用getInstance()方法。因为是第一次调用,A就发现instance是null的,于是它开始创建实例,就在这个时候,CPU发生时间片切换,线程B开始执行,它要使用SingletonClass,调用getInstance()方法,同样检测到instance是null——注意,这是在A检测完之后切换的,也就是说A并没有来得及创建对象——因此B开始创建。B创建完成后,切换到A继续执行,因为它已经检测完了,所以A不会再检测一遍,它会直接创建对象。这样,线程A和B各自拥有一个SingletonClass的对象——单例失败


    public class SingletonClass {
        
      private static class SingletonClassInstance {
        private static final SingletonClass instance = new SingletonClass();
      }
    
      public static SingletonClass getInstance() {
        return SingletonClassInstance.instance;
      }
    
      private SingletonClass() {
    
      }
        
    }



  • 相关阅读:
    [译] iOS 11.4.1 Beta:全新的USB限制模式
    [杂] 无人机取证的一些研究
    [杂] 将高版本iTunes备份恢复到低版本iOS设备中
    [手机取证] Apple Watch取证初探
    [手机取证] 绕过屏幕锁定启用调试模式-For Android 4.4.2
    [手机取证] “神器”IP-BOX的一些问题
    [杂] BOSE QC15维修小记
    iOS 8潜在的取证问题
    [Fraud] China UnionPay defrauded in Macau money laundering scandal
    [DFNews] Fire-Eye与Fox IT联合推出Cryptolocker解锁网站
  • 原文地址:https://www.cnblogs.com/sharecenter/p/5621065.html
Copyright © 2011-2022 走看看