单例模式

问题

多线程操作同一对象保证对象的一致性

解决思路

只有一次实例化过程,产生一个实例化对象,并提供返回该对象的方法。

单例模式的分类

1 饿汉式

在加载类的时候就产生实例对象

public class HungerySingleton {

    /**
* 在加载说就产生了实例对象
*/
private static HungerySingleton instance = new HungerySingleton(); private HungerySingleton(){ }
/**
* @return 返回实例对象
*/
public static HungerySingleton getInstance(){
return instance;
}
}

线程安全性:在加载时就已经实例化,所以只有一次实例化,线程是安全的。

不是懒加载

性能不好

2 懒汉式

在加载类时不声明实例对象,当使用该对象时才会实例化对象,不过对象也只能实例化一次。

public class HoonSinglenton {
/**
* 在加载时只声明变量不产生了实例对象
*/
private static HoonSinglenton instance = null;
private HoonSinglenton(){ }
/**
* @return 返回实例对象
*/
public static HoonSinglenton getInstance(){
if (instance == null){
instance = new HoonSinglenton();
}
return instance;
}
}

**线程安全性:不安全,不能保证实例对象的唯一性。**在多线程访问时,如果有两个线程同时进入if判断那么这两个线程获取的对象不是同一对象,不符合单例模式的定义。

是懒加载

性能好

3 懒汉式+同步方法

public class HoonSynSinglenton {

    private static HoonSynSinglenton instance = null;
private HoonSynSinglenton(){ } public synchronized static HoonSynSinglenton getInstance(){
if (instance == null){
instance = new HoonSynSinglenton();
}
return instance;
}
}

线程安全性:安全

是懒加载

性能不好:synchronized修饰的方法在多线程访问时会退化成串行执行。

4 DCL(Double-Check-Locking)

public class DCL {

    private static DCL instance = null;
private DCL(){ } public synchronized static DCL getInstance(){
if (instance == null){
synchronized(DCL.class){
if (instance == null){
instance = new DCL();
}
}
}
return instance;
}
}

性能比较好

懒加载

保证线程安全性

缺点:会因为指令重排序,引起空指针异常

5 volatile + DCL

private volatile static DCL instance = null;

DCL解决方案

6 Holder

使用比较广泛的一种单例模式

在声明类时,成员变量中不声明实例变量,而放到内部静态类中,在静态类中实例化,避免懒汉式中加锁的问题。

public class HolderSinglenton {

    private HolderSinglenton(){}

    private static class Holder{
private static HolderSinglenton instance = new HolderSinglenton();
} public static HolderSinglenton getInstance(){
return Holder.instance;
}
}

7 枚举

Effective Java推荐该方法

public class EnumSingletonDemo {

    private EnumSingletonDemo(){}

    private enum EnumHolder{
/**
* 单例对象
*/
INSTANCE;
private EnumSingletonDemo instance;
EnumHolder(){
this.instance = new EnumSingletonDemo();
}
private EnumSingletonDemo getInstance(){
return instance;
}
} public static EnumSingletonDemo getInstance(){
return EnumHolder.INSTANCE.getInstance();
}
}

代码中的的枚举类型是一个内部类,内部类在Java中使用是懒加载只有使用时才会加载。加载EnumSingletonDemo类不会引起内部类的加载。

设计模式之单例模式(Java)的更多相关文章

  1. 软件设计模式之单例模式(JAVA)

    什么是单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系 ...

  2. 设计模式之单例模式(JAVA实现)

    单例模式之自我介绍 我,单例模式(Singleton Pattern)是一个比较简单的模式,我的定义如下: Ensure a class has only one instance,and provi ...

  3. GOF23种设计模式之单例模式(java)

    GOF(group of four):四人帮 分类 创建者模式 单例模式 核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 优点: 由于单例模式只生成一个实例,减少了系统性能开销, ...

  4. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  5. java 23 - 2 设计模式之单例模式

    单例模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢?  A:把构造方法私有  B:在成员位置自己创建一个对象  C:通过一个公共的方法提供访问 单例模式之饿汉式: (一进来就造对 ...

  6. [转]JAVA设计模式之单例模式

    原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...

  7. 设计模式 -- 单例模式(Java&&PHP)

    所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 能够 ...

  8. java 设计模式之单例模式

    -------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...

  9. Java设计模式03:常用设计模式之单例模式(创建型模式)

    1.  Java之单例模式(Singleton Pattern ) 单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实 ...

  10. java设计模式之三单例模式(Singleton)

    单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔 ...

随机推荐

  1. 2020年深度学习DeepLearning技术实战班

    深度学习DeepLearning核心技术实战2020年01月03日-06日 北京一.深度学习基础和基本思想二.深度学习基本框架结构 1,Tensorflow2,Caffe3,PyTorch4,MXNe ...

  2. iOS开发-CoreMotion框架

    转自: CoreMotion是一个专门处理Motion的框架,其中包含了两个部分 加速度计和陀螺仪,在iOS4之前加速度计是由 UIAccelerometer 类 来负责采集数据,现在一般都是用Cor ...

  3. 数据库Oracle函数之单行函数的介绍

    函数介绍: 函数:是数据库产品中提供的能够处理查询结果的方法. 函数能够用于下面的目的: • 执行数据计算 • 修改单个数据项 • 格式化显示的日期和数字 • 转换列数据类型 • 函数有输入参数,并且 ...

  4. 2018HDU多校训练-3-Problem G. Interstellar Travel

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6325                                   Interstellar Tra ...

  5. 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享

    写在前面的话&&About me 网上写spring的文章多如牛毛,为什么还要写呢,因为,很简单,那是人家写的:网上都鼓励你不要造轮子,为什么你还要造呢,因为,那不是你造的. 我不是要 ...

  6. Django开发登录功能实战

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:凡夫俗子66 Django 如果是定义函数写登录路由,需要判断请求方法 ...

  7. 新版FPC摄像头测评 OV7725 OV7670 OV9650 OV9655 OV5640 OV5642 OV2640 OV3640 MT9D112

    新版FPC摄像头测评 OV7725 OV7670 OV9650 OV9655 OV5640 OV5642 OV2640 OV3640 MT9D112 最新制样新版FPC摄像头板卡,先看看结构尺寸 再瞧 ...

  8. Jmeter性能测试配置

    目录 Jmeter检查点/断言 Jmeter事务 Jmeter集合点 Jmeter检查点/断言 在上一章节中,我们通过调试脚本,通过人工验证脚本可以完成业务功能, 但在性能测试中,我们希望能通过自动验 ...

  9. 小胖求学系列之-文档生成利器(上)-smart-doc

    最近小胖上课总是挂着黑眼圈,同桌小张问:你昨晚通宵啦?小胖有气无力的说到:最近开发的项目接口文档没写,昨晚补文档补了很久,哎,昨晚只睡了2个小时.小张说:不是有生成文档工具吗,类似swagger2.s ...

  10. 要想深入理解mysql索引?这16个点你必须要了解!

    前言 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQ ...