Singleton in java
Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。
还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。
另外方面,Singleton也能够被无状态化。提供工具性质的功能,
Java Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。
如何使用?
一般,Java Singleton模式通常有几种形式:
- public class Singleton {
- private Singleton(){}
- //在自己内部定义自己一个实例,是不是很奇怪?
- //注意这是private 只供内部调用
- private static Singleton instance = new Singleton();
- //这里提供了一个供外部访问本class的静态方法,可以直接访问
- public static Singleton getInstance() {
- return instance;
- }
- }
第二种形式:
- public class Singleton {
- private static Singleton instance = null;
- public static synchronized Singleton getInstance() {
- //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
- //使用时生成实例,提高了效率!
- if (instance==null)
- instance=new Singleton();
- return instance; }
- }
使用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相关推荐
- Java Singleton设计模式
它是Java中最简单的设计模式之一. 如果有人问我哪种设计模式好,那么我会很自豪地说Singleton. 但是,当他们深入询问单身人士的概念时,我感到很困惑. 真的单身是那么困难吗? 确实不是,但是它 ...
- Java Singleton类中的线程安全
Singleton is one of the most widely used creational design pattern to restrict the object created by ...
- JAVA设计模式-单例模式(Singleton)线程安全与效率
一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...
- 在Java中实现单例模式的有效方法是什么? [关闭]
在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...
- Java中反射的三种常用方式
Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...
- java设计模式6--适配器模式(Adapter )
本文地址:http://www.cnblogs.com/archimedes/p/java-adapter-pattern.html,转载请注明源地址. 适配器模式(别名:包装器) 将一个类的接口转换 ...
- java设计模式5--原型模式(Prototype)
本文地址:http://www.cnblogs.com/archimedes/p/java-prototype-pattern.html,转载请注明源地址. 原型模式 用原型实例指定创建对象的种类,并 ...
- java设计模式4--建造者模式(Builder)
本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...
- java 静态内部类 线程安全问题_单例模式的七种写法, 面试题:线程安全的单例模式...
http://cantellow.iteye.com/blog/838473 http://meizhi.iteye.com/blog/537563 第一种(懒汉,线程不安全): Java代码 pu ...
最新文章
- 实验2 使用T-SQL编写程序
- java锁的有哪些_「并发编程」Java锁分类和特点有哪些
- LeetCode 1753. 移除石子的最大得分(优先队列)
- C#中5中timer的比较
- css方法div固定在网页底部
- ubuntu安装cmake
- EdrawMax使用方法
- 商品期货日内 Dual Thrust 交易策略
- python 中文排序(按拼音)
- 类名+单书名号——泛型,什么是泛型?如何使用泛型
- 大数据——Hadoop3.1.3安装与配置
- TI AM5728 CPSW网口调试笔记
- 跨链技术如何破解区块链的可扩展性难题?
- 车辆前组合灯出口德国做的E-mark认证可以在其他国家使用吗?
- 字典序问题:在数据加密和数据压缩中常需要对特殊的字符串进行编码.给定的字母表A 由26 个小写英文字母
- 整理18、19、20年关于《人工智能》的标准和评估规范
- Unbuntu远程电脑死机怎么解决
- 远程教学,微信群里就能上课、培训
- 光学知识之双折射现象解析
- 隐藏Tomcat版本信息
热门文章
- android自定义属性dimen,Android获取非自定义属性值
- python的简单程序代码_有那些用python修改python程序代码的简单方法?
- selenium webdriver处理HTML5的视频播放
- 视频编解码质量评价---BDBR与BD-PSNR
- C++栈与队列基本操作
- 亲密关系-【沟通目标】如何建立有效的谈话目标
- 震惊:selenium竟然不是自动化测试工具
- 计算机屏幕调节亮度,电脑屏幕亮度怎么调最好 有没有调节电脑屏幕亮度的软件...
- oppo手机解锁_手机解锁新风尚,OPPO的光域屏幕指纹技术又是哪根儿葱
- 服务器android打包,Android rom解包打包工具