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

      在程序中保证某类只有一个实例的几个方法:

      1.  classic singleton pattern

     1 public class Singleton {
     2    private static Singleton uniqueInstance ;
     3    private Singleton() {}
     4    public static Singleton getInstance() {
     5           if (uniqueInstance == null) {
     6                   return new Singleton();
     7            }
     8            return uniqueInstance;
     9     }
    10 }
    

        缺点: 当运行在多线程环境下,该方法仍然可能会造成同时创建两个以上的实例, 绝对是一大隐患啊,必须要杜绝。

      2.  让经典单例模式可以适应多线程的情况,有好几种方法可以改进,比如说同步锁(synchronized 语句).

     1 public class Singleton {
     2    private static Singleton uniqueInstance ;
     3    private Singleton() {}
     4    public static synchronized Singleton getInstance() {  //同步整个创建实例的方法,即保证该方法在任何时候都仅能由一个线程操作
     5           if (uniqueInstance == null) {
     6                   return new Singleton();
     7            }
     8            return uniqueInstance;
     9     }
    10 }
    

     缺点: 由于在整个程序运行过程中,该实例只需要被运行一次,而在每次invoke getInstance()时都要同步一次,这会大大降低程序运行性能,同步一个方法大约会降低运行效率的100倍。

      3. 减少同步的代码 

     public class Singleton {
         private volatile static Singleton uniqueInstance ;   //volatile 让每个线程都能正确读取uniqueInstance的值
         private Singleton() {}
         public static Singleton getInstance() {            
               if ( uniqueInstance == null) {       // 保证了只在创建实例时同步,即整个过程中只需同步一次代码
                 synchronized(Singleton.class) {
                    if (uniqueInstance == null) {
                          return new Singleton();
                     }
                 }
               }
               return uniqueInstance;
          }
     }

      缺点: 受限于java版本,由于JVM对volatile 实现的关系,java5 之前的版本可能不能进行有效的同步机制检查。

      4. 在线程调用实例前,实例化它

    public class Singleton {
        private static Singleton uniqueInstance = new Singleton();
        private Singleton() {}
        public static Singleton getInstance() {
               return uniqueInstance;
        }
    }
  • 相关阅读:
    数据分析只能当一辈子取数机?可能你缺少这个基础思维
    Funnel:漏斗图
    Calendar:日历图
    【自考】数据结构第五章图,期末不挂科指南,第9篇
    机器学习——TensorFlow Mnist数据集入门
    SpringCloud Alibaba微服务实战四
    视觉映射配置项VisualMapOpts
    chrome使用技巧(看了定不让你失望)
    chrome使用技巧(看了定不让你失望)
    chrome使用技巧(看了定不让你失望)
  • 原文地址:https://www.cnblogs.com/lovemo1314/p/3392658.html
Copyright © 2011-2022 走看看