你所知道的Java单例模式并不是单例模式
当我们搜索单例模式的时候,能看到很多例子,什么懒汉式、饿汉式,大概如下:
public class Singleton {
private static Singleton instance=null;
private Singleton(){
System.out.println("Singleton..init...");
}
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
当我们写一个main方法对上面的单例模式进行测试的时候发现如下:
public static void main(String []args){
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
System.out.println(s1);
System.out.println(s2);
}
结果:
Singleton..init...
td3.Singleton@1c80b01
td3.Singleton@1c80b01
好像确实没问题,好像就是那么回事,构造方法只被调用了一次,并且两次返回的都是同一个对象。
当时这这是单线程的情况下,如果是多线程的情况呢,如下:
public static void main(String []args){
/**
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
System.out.println(s1);
System.out.println(s2);
*/
for(int i=1;i<=10;i++){
new Thread("线程"+i){
public void run(){
Singleton s=Singleton.getInstance();
System.out.println("["+Thread.currentThread().getName()+"]"+s);
}
}.start();
}
}
========================结果========================
Singleton..init...
[线程1]td3.Singleton@1bf3d87
Singleton..init...
[线程4]td3.Singleton@1e4f7c2
Singleton..init...
Singleton..init...
[线程2]td3.Singleton@170bea5
[线程8]td3.Singleton@1e4f7c2
[线程6]td3.Singleton@1e4f7c2
[线程10]td3.Singleton@170bea5
[线程3]td3.Singleton@b8f8eb
[线程5]td3.Singleton@170bea5
[线程7]td3.Singleton@170bea5
[线程9]td3.Singleton@170bea5
从结果看到,很不幸,构造方法被调用了三次,也即是 new Singleton()调用的三次,打印的结果显示也是不同的实例。
所以,我们常见的单例是不靠谱的。如果给getInstance()方法加上synchronized关键字是可以的。
你所知道的Java单例模式并不是单例模式的更多相关文章
- Java 序列化 序列化与单例模式 [ 转载 ]
Java 序列化 序列化与单例模式 [ 转载 ] @author Hollis 本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏. 单例模式,是设计 ...
- Java设计模式之《单例模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该 ...
- Java设计模式之【单例模式】
Java设计模式之[单例模式] 何为单例 在应用的生存周期中,一个类的实例有且仅有一个 当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式 比如spring容器默认初始化的实例就是单例 ...
- Java设计模式中的单例模式
有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...
- Java设计模式之:单例模式
单例模式 建议实现方式:枚举方式实现单例 单例模式的定义 单例模式就是在程序运行中只实例化一次,创建一个全局唯一对象,有点像 Java 的静态变量,但是单例模式要优于静态变量,静态变量在程序启动的时候 ...
- Java与设计模式之单例模式(下) 安全的单例模式
关于单例设计模式,<Java与设计模式之单例模式(上)六种实现方式>介绍了6种不同的单例模式,线程安全,本文介绍该如何保证单例模式最核心的作用——“实现该模式的类有且只有一个实 ...
- Java与设计模式之单例模式(上)六种实现方式
阎宏博士在<JAVA与模式>中是这样描述单例模式的:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. ...
- Core Java之7种单例模式
初始化空 初始化创建 一把锁 两把锁 大专栏 Core Java之7种单例模式"headerlink" title="静态内部类">静态内部类 静态加载 ...
- 重学 Java 设计模式:实战单例模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 5个创建型模式的最后一个 在设计模式中按照不同的处理方式共包含三大类:创建型模式.结 ...
随机推荐
- Heap and HashHeap
Heap 堆(英语:Heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很 ...
- DOS命令解释程序的编写
实验一.DOS命令解释程序的编写 专业:物联网工程 姓名:黄淼 学号:201306104145 一. 实验目的 (1)认识DOS: (2)掌握命令解释程序的原理: (3)掌握简单的DOS调用方法 ...
- javascript中怎么让一个页面执行多个window.onload?
我们都知道在javascript中window.onload 只能有一个如果有多个的话后面的会覆盖前面的,今天我们来看看怎么让一个页面执行多个window.onload <script type ...
- Facebook内部分享:25个高效工作的小技巧
Facebook内部分享:25个高效工作的小技巧 Facebook 内部分享:不论你如何富有,你都赚不到更多的时间,你也回不到过去.没有那么多的假如,只有指针滴答的时光飞逝和你应该好好把握的现在,以下 ...
- [转载] 深入 superviser
模块简介 新人接触线上的时候一般都会碰到supervise这个工具,导师对这个模块的解释一般就是,这个模块是监控进程,当进程挂掉之后,supervise会将进程启动.这样当进程出 现问题,如因出cor ...
- wpf datagrid 如何让标头 及内容居中
头就是这么居中<DataGrid> <DataGrid.ColumnHeaderStyle> <Style TargetType="DataGridColumn ...
- awt组件中文乱码Intellij解决
-Dfile.encoding=GB18030 -Dfile.encoding=GB18030
- python中super关键字的用法
http://python.jobbole.com/86787/ class A: def __init__(self): print "enter A" print ...
- UIButton的常见设置
- (void)setTitle:(NSString *)title forState:(UIControlState)state;设置按钮的文字 - (void)setTitleColor:(UIC ...
- RMAN-03009 ORA-19504 ORA-27038
错误信息如下: RMAN> backup database tag='full20160112' format '/orabak/rman/full20160112' include curre ...