单例 (JAVA)
java中单例模式是一种常见的设计模式,以下是它的特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例
第一种(懒汉,线程不安全):
2 private static Singleton instance;
3
4 public static Singleton getInstance() {
5 if (instance == null) {
6 instance = new Singleton();
7 }
8 return instance;
9 }
10 }
11
懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间
由于懒汉式的实现是线程安全的,这样会降低整个访问的速度,而且每次都要判断.
第二种(懒汉,线程安全):
2 private static Singleton instance;
3
4 public static synchronized Singleton getInstance() {
5 if (instance == null) {
6 instance = new Singleton();
7 }
8 return instance;
9 }
10 }
11
第三种(饿汉):
2 private static Singleton instance = new Singleton();
3
4 public static Singleton getInstance() {
5 return instance;
6 }
7 }
8
第四种(饿汉,变种):
2 private Singleton instance = null;
3 static {
4 instance = new Singleton();
5 }
6
7 public static Singleton getInstance() {
8 return this.instance;
9 }
10 }
11
表面上看起来差别挺大,其实更第三种方式差不多,都是在类初始化即实例化instance。
第五种(静态内部类):
2 private static class SingletonHolder {
3 private static final Singleton INSTANCE = new Singleton();
4 }
5
6 public static final Singleton getInstance() {
7 return SingletonHolder.INSTANCE;
8 }
9 }
10
优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading
第六种(枚举):
2 INSTANCE;
3 public void whateverMethod() {
4 }
5 }
6
优点:不仅能避免多线程同步问题,而且还能防止反序列化
第七种(双重校验锁):
2 private volatile static Singleton singleton;
3
4 public static Singleton getSingleton() {
5 if (singleton == null) {
6 synchronized (Singleton.class) {
7 if (singleton == null) {
8 singleton = new Singleton();
9 }
10 }
11 }
12 return singleton;
13 }
14 }
15
总结
有两个问题需要注意:
1、如果单例由不同的类装载器装入,那便有可能存在多个单例类的实例。假定不是远端存取,例如一些
servlet容器对每个
servlet使用完全不同的类 装载器,这样的话如果有两个
servlet访问一个单例类,它们就都会有各自的实例。
2、如果
Singleton实现了
java.io.Serializable接口,那么这个类的实例就可能被序列化和复原。不管怎样,如果你序列化一个单例类的对象,接下来复原多个那个对象,那你就会有多个单例类的实例。
对第一个问题修复的办法是:
2 throws ClassNotFoundException {
3 ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
4
5 if(classLoader == null)
6 classLoader = Singleton.class.getClassLoader();
7
8 return (classLoader.loadClass(classname));
9 }
10 }
11
对第二个问题修复的办法是:
2 public static Singleton INSTANCE = new Singleton();
3
4 protected Singleton() {
5
6 }
7 private Object readResolve() {
8 return INSTANCE;
9 }
10 }
11
单例 (JAVA)的更多相关文章
- 单例 ------ JAVA实现
		单例:只能实例化一个对象,使用场景比如打印机. 最推荐的是采用饿汉式:双重校验锁用到了大量的语法,不能保证这些语法在所用场合一定没问题,所以不是很推荐:总之简单的才是最好的,就饿汉式!!! C++ 创 ... 
- javaWeb项目中到底什么是单例,多例
		你用杯子喝可乐,喝完了不刷,继续去倒果汁喝,就是单例.你用杯子喝可乐,直接扔了杯子,换个杯子去倒果汁喝,就是多例. 数据库连接池就是单例模式,有且仅有一个连接池管理者,管理多个连接池对象. 1. 什么 ... 
- java 单例
		Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例.饿汉式单例. 饿汉式和懒汉式区别 从名字上来说,饿汉和懒汉, 饿汉就是类一旦加载,就把单例初始化完成,保证 ... 
- Java设计模式之单例
		一.Java中的单例: 特点: ① 单例类只有一个实例 ② 单例类必须自己创建自己唯一实例 ③ 单例类必须给所有其他对象提供这一实例 二.两种模式: ①懒汉式单例<线程不安全> 在类加载时 ... 
- java单例的几种实现方法
		java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class LazyHolder ... 
- Java 多线程之单例设计模式
		转载:https://segmentfault.com/a/1190000007504892 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例.饿汉 ... 
- java单例类/
		java单例类 一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一 ... 
- java单例-积木系列
		一步步知识点归纳吧,把以前似懂非懂,了解表面,知道点不知道面的知识归一下档. 懒汉式单例: 私有化构造函数,阻止外界实例话对象,调用getInstance静态方法,判断是否已经实例化. 为什么是懒 ... 
- 如何防止JAVA反射对单例类的攻击?
		在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ... 
随机推荐
- Matlab tips and tricks
			matlab tips and tricks and ... page overview: I created this page as a vectorization helper but it g ... 
- MapReduce中的分区方法Partitioner
			在进行MapReduce计算时,有时候需要把最终的输出数据分到不同的文件中,比如按照省份划分的话,需要把同一省份的数据放到一个文件中:按照性别划分的话,需要把同一性别的数据放到一个文件中.我们知道最终 ... 
- Build an ETL Pipeline With Kafka Connect via JDBC Connectors
			This article is an in-depth tutorial for using Kafka to move data from PostgreSQL to Hadoop HDFS via ... 
- iphone 数字字段颜色兼容问题
			在iphone手机中,有些字段的颜色会自动发生变化,在head中添加如下meta即可.<meta name = "format-detection" content=&quo ... 
- AngularJS学习之SQL
			1.使用PHP从MySQL中读取数据: <div ng-app="myApp" ng-controller="customersCtrl" > &l ... 
- 快销品 车销批发管理手持终端PDA系统 打印开单 入库 库存 盘点多功能一体
			手持POS终端PDA移动开单 PDA通过扫描商品条码移动开单,实现便携式办公,伴随式销售,浩瀚技术研发团队开发的一款最新产品,PDA能通过WIFI无线局域网.GPRS互联网直接与主机连接,让公司业务人 ... 
- BZOJ 3282 Tree ——KD-Tree
			[题目分析] 明显的LCT维护连通性的题目. access的操作是比较巧妙的,可以把结点到根变成偏爱路径,而且保证了该点是链上深度最深的点. 而且需边的思想也很巧妙,保证了复杂度. 但是只能用于修改路 ... 
- 疯狂java笔记(七) - Java集合之Map
			Map是以键值对(key-value)的形式来存储数据的.而且Map不允许key的重复,通过Map存储key-value对时,只需要考虑key的存储就可以,key存储后value就会跟着key(完全可 ... 
- Windows 8 系统安装
			系统城 http://www.xitongcheng.com/win8/ 1. 下载 win8: http://msdn.itellyou.cn/2. 准备 4G 以上 U 盘,下载 win8 ... 
- poj2109
			刚开始看着道题时,感觉不用高精度好像就没法做,想了半天然后果断去看依然博客(这样确实不好),发现又用到了double(这个可以放“+” “-” 300多位的家伙!!!) #include <io ... 
