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. 实验2  使用T-SQL编写程序
  2. java锁的有哪些_「并发编程」Java锁分类和特点有哪些
  3. LeetCode 1753. 移除石子的最大得分(优先队列)
  4. C#中5中timer的比较
  5. css方法div固定在网页底部
  6. ubuntu安装cmake
  7. EdrawMax使用方法
  8. 商品期货日内 Dual Thrust 交易策略
  9. python 中文排序(按拼音)
  10. 类名+单书名号——泛型,什么是泛型?如何使用泛型
  11. 大数据——Hadoop3.1.3安装与配置
  12. TI AM5728 CPSW网口调试笔记
  13. 跨链技术如何破解区块链的可扩展性难题?
  14. 车辆前组合灯出口德国做的E-mark认证可以在其他国家使用吗?
  15. 字典序问题:在数据加密和数据压缩中常需要对特殊的字符串进行编码.给定的字母表A 由26 个小写英文字母
  16. 整理18、19、20年关于《人工智能》的标准和评估规范
  17. Unbuntu远程电脑死机怎么解决
  18. 远程教学,微信群里就能上课、培训
  19. 光学知识之双折射现象解析
  20. 隐藏Tomcat版本信息

热门文章

  1. android自定义属性dimen,Android获取非自定义属性值
  2. python的简单程序代码_有那些用python修改python程序代码的简单方法?
  3. selenium webdriver处理HTML5的视频播放
  4. 视频编解码质量评价---BDBR与BD-PSNR
  5. C++栈与队列基本操作
  6. 亲密关系-【沟通目标】如何建立有效的谈话目标
  7. 震惊:selenium竟然不是自动化测试工具
  8. 计算机屏幕调节亮度,电脑屏幕亮度怎么调最好 有没有调节电脑屏幕亮度的软件...
  9. oppo手机解锁_手机解锁新风尚,OPPO的光域屏幕指纹技术又是哪根儿葱
  10. 服务器android打包,Android rom解包打包工具