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. }  



            

  • 相关阅读:
    (转)搜索Maven仓库 获取 groupid artifactId
    idea自用快捷键(非常实用)
    (2)一起来看下使用mybatis框架的insert语句的源码执行流程吧
    (1)复习jdbc操作,编译mybatis源码,准备为你的简历加分吧
    关于CPU核心,线程,进程,并发,并行,及java线程之间的关系
    数组排序
    泛型类、泛型方法、类型通配符的使用
    数组的三种声明方式总结、多维数组的遍历、Arrays类的常用方法总结
    Java基本数据类型总结、类型转换、常量的声明规范,final关键字的用法
    JAVA基础语法——标识符、修饰符、关键字(个人整理总结)
  • 原文地址:https://www.cnblogs.com/guoliangxie/p/5283543.html
Copyright © 2011-2022 走看看