设计模式之单例模式(Java)
单例模式
问题
多线程操作同一对象保证对象的一致性
解决思路
只有一次实例化过程,产生一个实例化对象,并提供返回该对象的方法。
单例模式的分类
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)的更多相关文章
- 软件设计模式之单例模式(JAVA)
什么是单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系 ...
- 设计模式之单例模式(JAVA实现)
单例模式之自我介绍 我,单例模式(Singleton Pattern)是一个比较简单的模式,我的定义如下: Ensure a class has only one instance,and provi ...
- GOF23种设计模式之单例模式(java)
GOF(group of four):四人帮 分类 创建者模式 单例模式 核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 优点: 由于单例模式只生成一个实例,减少了系统性能开销, ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- java 23 - 2 设计模式之单例模式
单例模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? A:把构造方法私有 B:在成员位置自己创建一个对象 C:通过一个公共的方法提供访问 单例模式之饿汉式: (一进来就造对 ...
- [转]JAVA设计模式之单例模式
原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...
- 设计模式 -- 单例模式(Java&&PHP)
所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 能够 ...
- java 设计模式之单例模式
-------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...
- Java设计模式03:常用设计模式之单例模式(创建型模式)
1. Java之单例模式(Singleton Pattern ) 单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实 ...
- java设计模式之三单例模式(Singleton)
单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔 ...
随机推荐
- Ubuntu 18.04 LTS上安装NFS服务器和客户端
NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器.操作系统以及低层传送协议无关的存取远程文件的操作.RPC采用了XDR的支持.XDR是一种与机器无关的 ...
- 带着canvas去流浪系列之九 粒子动画【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- Web安全-之文件上传漏洞场景
1 上传漏洞危害介绍 上传是Web中最常见的功能,如果上传功能存在设计.编码缺陷,就容易形成上传漏洞,从而成为致命的安全问题,攻击者可以通过上传脚本木马,实现查看/篡改/删除源码和任意涂鸦网页,可 ...
- 深入比特币原理(三)——交易的输入(input)与输出(output)
本节内容非常重要,如果你不能很好的掌握本节内容,你无法真正理解比特币的运行原理,请务必要学习清楚. 比特币的交易模型为UTXO(unspend transaction output),即只记录未花费的 ...
- springcloud-Eureka组件
一.简介 Eureka 是 Netflix 开发的服务发现框架,本身是一个基于 REST 的服务,主要用于定位运行在 AWS 域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringC ...
- react-native布局中的层级问题(zIndex,elevation)
目录 关于层级的zIndex/elevation 1.zIndex是rn在0.30开始支持的属性,是可以生效的: 2.shadow和elevation 结论 关于层级的zIndex/elevation ...
- CF 526F Max Mex(倍增求LCA+线段树路径合并)
Max Mex 题目地址:https://codeforces.com/contest/1084/problem/F 然后合并时注意分情况讨论: 参考代码: #include<bits/stdc ...
- UESTC-1964命运石之门(类似SPFA的BFS)
命运石之门 Time Limit: 1000 MS Memory Limit: 256 MB Submit Status "这一切都是命运石之门的选择!" 凶真博士发明了能 ...
- ARTS-S Why do India and Pakistan keep fighting over Kashmir?
原文 On Wednesday, Pakistani and Indian fighter jets engaged in a skirmish over Indian-controlled terr ...
- java异常有效实践
异常在我们的平时开发过程中是非常寻常并且经常会面对的,我们有很多方式来处理和使用异常.充分发挥异常的优点可以提高程序的可读性,可靠性和可维护性.但是如果使用不当,也会带来很多负面影响. 参考 effe ...