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

    • 饿汉式 :线程安全(普通)
    Class Singleton{
        private Singleton(){}               //1.私有构造函数
        private static Singleton instance = new Singleton ();     //2.创建本类对象
        public static Singleton getInstance(){          //3.对外提供公共的访问方式
            return instance;
        }
    }
    • 懒汉式:线程不安全(普通)

    public class Singleton {

      private Singleton(){}; //1.私有构造函数

      private static Singleton instance; //2.声明一个本类的引用

      public static Singleton getInstance(){ //3.对外提供公共的访问方式

        if(instance == null){

          instance = new Singleton();

        }

        return instance;

      }

    }

    • 饿汉式:线程安全(使用static final修饰,不能被更改)
    1 class Singleton {
    2     private Singleton(){};
    3     public static final Singleton s = new Singleton();      //被final修饰的变量不能被更改    
    4 }
    • 静态内部类:线程安全 (使用内部类)
     1 public class Singleton {
     2     private Singleton() {
     3     }
     4     
     5     public static Singleton getInstance() {
     6         return SingletonHolder.mInstance;
     7     }
     8     
     9     private static class SingletonHolder {
    10         private static final Singleton mInstance = new Singleton();
    11     }
    12 }
    • 懒汉模式:线程安全(volatile和sync修饰)
     1 public class Singleton {
     2     public volatile static Singleton singleton = null;
     3     private Singleton(){ //构造方法私有化,防止外部调用生成实例化,比如反射
     4         if(singleton!=null){
     5             throw new RuntimeException("此类对象为单例模式,已经被实例化");
     6         }
     7     }
     8 
     9     /**
    10      * 1.为什么会有线程不安全的问题?
    11      * 如果不加同步块,那么线程A抢到走到此if (singleton == null) 停了,线程B此时抢到了就new了一个对象,当线程B
    12      * 走完了,线程A就接着此if (singleton == null)继续执行,此时就又new了一个对象,这样就导致new了两个对象
    13      * 2.为什么加了同步块,外层还要加此句判断?
    14      * 因为如果当是单线程的时候也会同步了,就影响了性能
    15      */
    16     public static Singleton getSingleton(){
    17         if(singleton==null) {
    18             synchronized (Singleton.class) { //通过反射:类名.class 得到Class类对象
    19                 if (singleton == null) {
    20                     singleton = new Singleton();
    21                 }
    22             }
    23         }
    24         return singleton;
    25     }
    26 }
  • 相关阅读:
    Visual Studio 2005 Starter Kits
    怎样去做才是朋友?
    C#读写日志文本文件
    [文摘20080707]马云追加投资20亿 淘宝首定10年超沃尔玛目标
    [转]在WinForm应用程序中实现自动升级
    [转]官方Flash CS3简体中文帮助文档下载,AS3.0简体中文帮助文档下载
    [引]MySQL INNODB类型表的外键关联设置
    [转]winfrom让弹出的MessageBox在指定时间内自动销毁
    生活开心一笑 之 "我家半"与"QQ病毒"
    [English20080721]疯狂英语365句
  • 原文地址:https://www.cnblogs.com/zchok/p/11383574.html
Copyright © 2011-2022 走看看