Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。

还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。

另外方面,Singleton也能够被无状态化。提供工具性质的功能,

Java Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。

我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。

如何使用?

一般,Java Singleton模式通常有几种形式:

  1. public class Singleton {
  2. private Singleton(){}
  3. //在自己内部定义自己一个实例,是不是很奇怪?
  4. //注意这是private 只供内部调用
  5. private static Singleton instance = new Singleton();
  6. //这里提供了一个供外部访问本class的静态方法,可以直接访问
  7. public static Singleton getInstance() {
  8. return instance;
  9. }
  10. }

第二种形式:

  1. public class Singleton {
  2. private static Singleton instance = null;
  3. public static synchronized Singleton getInstance() {
  4. //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
  5. //使用时生成实例,提高了效率!
  6. if (instance==null)
  7. instance=new Singleton();
  8. return instance; }
  9. }

使用Singleton.getInstance()可以访问单态类。

上面第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。

注意到lazy initialization形式中的synchronized,这个synchronized很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。关于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的讨论,有兴趣者进一步研究。

一般认为第一种形式要更加安全些。

使用Java Singleton模式注意事项:

有时在某些情况下,使用Singleton并不能达到Singleton的目的,如有多个Singleton对象同时被不同的类装入器装载;在EJB这样的分布式系统中使用也要注意这种情况,因为EJB是跨服务器,跨JVM的。

我们以SUN公司的宠物店源码(Pet Store 1.3.1)的ServiceLocator为例稍微分析一下:

在Pet Store中ServiceLocator有两种,一个是EJB目录下;一个是WEB目录下,我们检查这两个ServiceLocator会发现内容差不多,都是提供EJB的查询定位服务,可是为什么要分开呢?仔细研究对这两种ServiceLocator才发现区别:在WEB中的ServiceLocator的采取Singleton模式,ServiceLocator属于资源定位,理所当然应该使用Singleton模式。但是在EJB中,Singleton模式已经失去作用,所以ServiceLocator才分成两种,一种面向WEB服务的,一种是面向EJB服务的。

Java Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易,需要对Java的类,线程,内存等概念有相当的了解。

--------

转自 http://developer.51cto.com/art/200907/134903.htm

转载于:https://www.cnblogs.com/gaoqichao/archive/2012/07/19/2600009.html

Singleton in java相关推荐

  1. Java Singleton设计模式

    它是Java中最简单的设计模式之一. 如果有人问我哪种设计模式好,那么我会很自豪地说Singleton. 但是,当他们深入询问单身人士的概念时,我感到很困惑. 真的单身是那么困难吗? 确实不是,但是它 ...

  2. Java Singleton类中的线程安全

    Singleton is one of the most widely used creational design pattern to restrict the object created by ...

  3. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  4. 在Java中实现单例模式的有效方法是什么? [关闭]

    在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...

  5. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

  6. java设计模式6--适配器模式(Adapter )

    本文地址:http://www.cnblogs.com/archimedes/p/java-adapter-pattern.html,转载请注明源地址. 适配器模式(别名:包装器) 将一个类的接口转换 ...

  7. java设计模式5--原型模式(Prototype)

    本文地址:http://www.cnblogs.com/archimedes/p/java-prototype-pattern.html,转载请注明源地址. 原型模式 用原型实例指定创建对象的种类,并 ...

  8. java设计模式4--建造者模式(Builder)

    本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...

  9. java 静态内部类 线程安全问题_单例模式的七种写法, 面试题:线程安全的单例模式...

    http://cantellow.iteye.com/blog/838473 http://meizhi.iteye.com/blog/537563 第一种(懒汉,线程不安全): Java代码  pu ...

最新文章

  1. 【原创】Chrome最新版(53-55)再次爆出BUG!
  2. luogu4074-[WC2013]糖果公园
  3. 易创课堂武汉站-NTES@百位创业者智慧众筹
  4. centos7.9使用ssh命令进行登陆云服务器
  5. python输入input数组_Python学习——实现简单的交互raw_input的使用
  6. FragmentActivity和Activity的区别
  7. Intellij idea 运行 vertx examples
  8. 基于LSTM网络的藏头诗和古诗自动生成(附完整代码和数据)
  9. 基于VS + Qt编程的UG/NX二次开发
  10. 英寸和厘米之间的转换
  11. 中国芝麻市场竞争规模及销售渠道分析报告2022-2028年版
  12. IBM与广东中医院 携手共建智慧医疗
  13. Word2010图片组合
  14. QQ交谈小图标代码html,仿qq聊天工具设计源码及说明
  15. PAT L1-046 整除光棍 光棍当然不是单身汪呢
  16. MATLAB :xlim 、 ylim 、zlim简介
  17. php,调用百地图度API实现标记
  18. 阿里云服务器,解析二级域名
  19. 初学实体框架EF(Entity Framework)
  20. android SystemUI 流程分析

热门文章

  1. mysql 断言,mysql触发器模拟断言
  2. itextpdf将带复选框的html_HTML基础知识
  3. matlab sizeof size,使用Matlab进行MEXing C时,size_t和mwSize之间的差异
  4. python刷新显示_Python在同一位置刷新显示进度信息
  5. 曼昆《经济学原理宏观》读书笔记
  6. python21天打卡Day9-string和dict类型互转
  7. 不是一流大学毕业,却通过自学软件测试,进了阿里年薪初始22K
  8. python+selenium自动化测试-Windows环境搭建
  9. linux技术属于什么系,什么云计算技术?想学好这个必须了解的!
  10. 最近项目参考的文章们