zoukankan      html  css  js  c++  java
  • 1、单例模式(饿汉/懒汉)

    在我们平常的开发过程中会用到很多设计模式,最近准备一一整理出来,后续会不断的更新!  先写一个最最见的的单例模式吧!

                1、私有化构造方法,使外部不能直接建立实例对象

                2、在本类内部创建私有化一个本类实例对象

                3、提供一个static方法,返回本类实例化对象,供外部直接调用

            1、饿汉式:(不管使用与否直接创建实例对象)

    1. public class Singleton{
    2.     //1私有化构造方法
    3.     private Singleton(){
    4.     }
    5.    
    6.     //创建本类实例对象,这里必须为static类型,可以被static方法调用
    7.     private static Singleton singleton = new Singleton();
    8.     //提供获取本类实例的方法,应为外部不能建立本类实例,所以写static方法可以用类名直接调用
    9.     public static Singleton getSingleton(){
    10.         return singleton;
    11.     }
    12.  }

        

            2、懒汉式(等需要使用的时候才去创建)

    1. public class Singleton{
    2.     private Singleton(){
    3.     }
    4.    private Static Singleton singleton = null;
    5.    
    6.    public static getSingleton(){
    7.        if(singleton == null){
    8.            singleton = new Singleton();
    9.        }
    10.        return Singleton;
    11.   }
    12. }

    说明:懒汉式是线程不安全的。

    -----

    当然,单例模式深入的研究,也不止这些,还会有如何解决线程不安全问题,并且怎么保证效率比较高,这些会用到锁的概念,这些可以到网上找找别的博客看看。 

     ----线程安全的单列模式:(双重检查)

    1. public class MySingleton {  
    2.       
    3.     //使用volatile关键字保其可见性  
    4.     volatile private static MySingleton instance = null;  
    5.       
    6.     private MySingleton(){}  
    7.        
    8.     public static MySingleton getInstance() {  
    9.         try {    
    10.             if(instance != null){//懒汉式   
    11.                   
    12.             }else{  
    13.                 //创建实例之前可能会有一些准备性的耗时工作   
    14.                 Thread.sleep(300);  
    15.                 synchronized (MySingleton.class) {  
    16.                     if(instance == null){//二次检查  
    17.                         instance = new MySingleton();  
    18.                     }  
    19.                 }  
    20.             }   
    21.         } catch (InterruptedException e) {   
    22.             e.printStackTrace();  
    23.         }  
    24.         return instance;  
    25.     }  
    26. }  



            

  • 相关阅读:
    井字棋先手必胜图解
    python 回溯法 子集树模板 系列 —— 19、野人与传教士问题
    pandas 索引与列相互转化
    按概率随机选取
    java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**
    java中文乱码解决之道(一)-----认识字符集
    Java提高篇(三八)-----Java集合细节(四):保持compareTo和equals同步
    Java提高配(三七)-----Java集合细节(三):subList的缺陷
    Java提高篇(三六)-----Java集合细节(二):asList的缺陷
    Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量
  • 原文地址:https://www.cnblogs.com/guoliangxie/p/5283543.html
Copyright © 2011-2022 走看看