相信大家对单例模式应该不陌生,每个人都能写出好多种单例模式的实现,总结来说就有五种:懒汉、饿汉、静态内部类、枚举和双重检查锁定。针对这几种方式的代码,可以在网上搜索到,这里就不再细说。
最近又看了一遍单例的几种实现方式,发现了一些其他东西。先看以下单例模式的实现代码
public class Singleton2 {
private Singleton2(){}
private static Singleton2 instance;
public static synchronized Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
private Singleton2(){}
private static Singleton2 instance;
public static synchronized Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
这种实现方式利用了同步的方式保证线程安全,但是效率特别低下,同步锁要善用。
为了提高效率,可以把同步锁放到方法里,先判断instance是否为空,若不为空加锁进行初始化,若为空就可以直接获取对象,这样可以减少一大部分的线程等待,代码如下:
public class Singleton7 {
private Singleton7(){}
private Singleton7(){}
private static Singleton7 instance;
public static Singleton7 getInstance() {
if (instance == null) {
synchronized (Singleton7.class) {
if (instance == null) {
instance = new Singleton7();
}
}
}
return instance;
}
}
现在提个问题,以上代码真的正确吗?觉得代码没问题的人,可以继续往下看,能看出问题的,估计下面的东西也知道。
这里先把问题点明,以上代码中这一行private static Singleton7 instance;是有问题的,缺少了修饰符volatile,这个可是很重要的。
这里先说明类初始化大概的流程:
1、分配内存空间
2、初始化对象
3、设置instance指向分配的内存地址
但是在这三步中,第二步和第三步是可以调换顺序的,也即
1、分配内存空间
3、设置instance指向分配的内存地址
2、初始化对象
基于上面的理论,以上代码在缺少volatile的情况下,会有以下问题
从图中大致能看出B线程虽然获取到了instance对象,但这个对象其实没有真正初始化。
知道这个问题之后,volatitle在这里就能起到至关重要的作用了,使用了volatitle之后,在JDK1.5之后,类初始化流程中第二步和第三步在多线程的情况会被禁止,从而保证代码的正常执行。
相关推荐
这种写法可以保证线程安全.两个if都是不能去掉的.如果去掉第一个if: 那么所有的线程都会到这里来先获取锁,然后判断singleton是否为空.所有线程都会串行
单例模式单例模式单例模式单例模式单例模式单例模式单例模式单例模式
单例模式和工厂模式结合应用,实现了产品的生产,适合用做课程设计,包含详细文档和代码。Java语言。喜欢的可以下载来看看那
C#单例模式C#单例模式详解C#单例模式详解C#单例模式详解
php单例模式php单例模式php单例模式php单例模式
单例模式详解~~单例模式详解~~单例模式详解~~
设计模式 中的 单例模式和观察者模式;以简单实例说明单例模式和观察者模式
模式就像是OOP开发人员的配方,每种模式都提供了所需的成分。模式对OOP开发人员尤其有用,因为它有助于创建稳定的API,...本章将介绍两种常用的模式:单例模式和工厂模式。前者被称为类的职责,后者被称为类的多态性。
单例模式的七种实现方法以及分析,可以...3.5双重检查实现单例模式 10 3.6使用静态内部类实现单例模式 12 3.7使用枚举类实现单例模式 13 4.单例模式怎么用才合理? 14 4.1测试 14 4.2无边界 15 5.设计模式学习总结: 15
细心整合和单例模式和工厂模式的几种模型,懒汉式,饿汉式,如何并发操作模式,等都有详细讲解
一个简单的java工程,包含注释,一目了然,其中包含了单例模式的所有实现方式,懒汉式,饿汉式,双重校验,枚举,静态内部类等方式实现单例。
Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式...
NULL 博文链接:https://bijian1013.iteye.com/blog/2285276
2020-02-10 王争设计模式之美进入课程讲述:冯永吉时长 10:21大小 8.31M上两节课中,我们针对单例模式,讲解了单例的应用场景、几种常见的代码实现
设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试
在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时如何处理这些缺陷。 单例模式适合于一个类只有一个实例的情况,比如窗口管理器...
双重校验锁模式结合了懒汉模式和饿汉模式的优点,既实现了延迟加载,又保证了线程安全。你可以根据需求选择合适的单例模式实现方式。
单例模式--只能弹出一个窗体 只能弹出一个窗体
几种单例模式的书写方式
今天小编就为大家分享一篇关于Java双重检查加锁单例模式的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧