Java单例模式学习笔记

发表于:2011-3-18 10:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:asdtiang    来源:51Testing软件测试网采编

#
java

  Singleton 模式的宗旨在于确保某个类只有一个实例,别且为之提供一个全局访问点。为了防止其他工作人员实例化我们的类,

  可以为该类创建唯一一个构造器,并将构造器的可见设置为私有。值得注意的是,如果我们创建了其他的非私有的构造器,或者根本没有为该类提

  供构造器,那么其他人员还是能实例化我们的类。 如果不希望提前创建单例对象,我们可以等到第一次使用该单例对象的时候在创建它,即

  滞后初始化。滞后初始化单例对象有两个理由:

  1. 也许在静态初始化时间,你没有关于如何初始化单例对象的足够信息。

  2. 选择滞后初始化单例的目的也许为了等待资源,诸如数据库连接,尤其是在某些特定会话中不需要这个单例的应用程序中。

  如果在多线程环境中对单例采用滞后初始化,那么我们必须小心防止多个线程同时初始化该

  通常单例模式在Java语言中,有两种构建方式:

  懒汉方式:指全局的单例实例在第一次被使用时构建。延迟初始化。

  饿汉方式:指全局的单例实例在类装载时构建。 急切初始化。

  1、饿汉式单例类

  • public class Singleton1 {  
  •       
  •     private Singleton1() {  
  •     }  
  •     // 在自己内部定义自己一个实例. 
  •     // 注意这是private 只供内部调用 
  •     private static Singleton1 instance = new Singleton1();  
  •     /** *//** 
  •      *  这里提供了一个供外部访问本class的静态方法,可以直接访问 
  •      * @return 
  •      */ 
  •     public static Singleton1 getInstance() {  
  •         return instance;  
  •     }  
  • }
  •   2、懒汉式单例类

  • public class Singleton2 {  
  •     private static Singleton2 instance = null;  
  •     /** *//** 
  •      * 这个方法比上面有所改进,不用每次都进行生成对象,只是第一次  
  •      * 使用时生成实例,提高了效率! 
  •      * @return 
  •      */ 
  •     public static  Singleton2 getInstance() {      
  •         if (instance == null)  
  •             instance = new Singleton2();  
  •         return instance;  
  •     }  
  • }
  •   下面主要多线程问题,在懒汉单例中,单线程是没有问题的,但多线程时就会有可能出现两个或者以上的Singletion2实例的情况。

      例如:线程1在判断instance==null为真,扫行new操作时,在执行new操作之前,判断为真之后,线程2正好执行判断操作,这时instance还为null.因此,线程2也会执行new操作。以此类推,在高并发下面,就可能存在两个或者以上的Singletion2的实例。显然,这是不正确的。

    21/212>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号