你所知道的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...
[email protected]
[email protected]

好像确实没问题,好像就是那么回事,构造方法只被调用了一次,并且两次返回的都是同一个对象。

当时这这是单线程的情况下,如果是多线程的情况呢,如下:

    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][email protected]
Singleton..init...
[线程4][email protected]
Singleton..init...
Singleton..init...
[线程2][email protected]
[线程8][email protected]
[线程6][email protected]
[线程10][email protected]
[线程3][email protected]
[线程5][email protected]
[线程7][email protected]
[线程9][email protected]

从结果看到,很不幸,构造方法被调用了三次,也即是 new Singleton()调用的三次,打印的结果显示也是不同的实例。

所以,我们常见的单例是不靠谱的。如果给getInstance()方法加上synchronized关键字是可以的。

你所知道的Java单例模式并不是单例模式

时间: 2024-10-24 23:50:08

你所知道的Java单例模式并不是单例模式的相关文章

JAVA中的单例模式(采用单例模式定义的类)(转)

1     单例(Singleton)模式:单例模式确保某一个类只有一个 实例,而且该类只能是自己 实例化自己并向其他类公开 这个实例的对象创建 模式 采用单例模式的类:根据单例模式知道其要满足以下三点 1. 确保某一个类只有一个实例 2. 而且自己实例化 3. 并向其他类提供这个实例类 . 2    确保以上三点的所采用的编程策略     * 把构造方法声明为Private.确保只能由自己创建,避免外部创建实例或者被子类继承从而创造额外实例:    * 定义一个私有静态的该类的实例作为该类的数

Java Object 序列化与单例模式 [ 转载 ]

Java Object 序列化与单例模式 [ 转载 ] @author Hollis 本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏. 单例模式,是设计模式中最简单的一种.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案.关于单例模式的使用方式,可以阅读单例模式的七种写法 但是,单例模式真的能够实现实例的唯一性吗? 答

【Java设计模式】1.单例模式

写在前面 Java设计模式总共有23种,虽然我也没仔细数.单例模式,好像在常用的Java项目中必不可少吧,好比是做米饭绝对少不了米,没毛病.这里谈谈自己的理解吧,大致分为几个方面: 1.哪些时候需要用到单例模式,即单例模式的使用场景,谈谈Singleton Mode的概念 2.常见有哪几种单例模式 3.单例模式的好处 4.单例模式和线程安全的那些事儿 1.0 什么时候需要单例模式 1.1 定义 单例模式,是一种创建对象的设计模式,单例模式确保其某一个类只有一个实例,即:它要确保整个类有且只有一个

【JAVA】设计模式之单例模式

前言 java最常见的设计模式就是单例模式,而单例模式最常见的就是懒汉式和饿汉式,现在就分别看一下 1.懒汉式 懒汉式比较懒,当别人用到时才会初始化实例,而当有多个人同时用到就可能产生多个实例,造成线程安全问题. public class Lazy { private static Lazy lazy; private Lazy{ } public static Lazy getLazy() { if(lazy == null){ lazy = new Lazy(); } return lazy

Java设计模式之:单例模式

单例模式 建议实现方式:枚举方式实现单例 单例模式的定义 单例模式就是在程序运行中只实例化一次,创建一个全局唯一对象,有点像 Java 的静态变量,但是单例模式要优于静态变量,静态变量在程序启动的时候JVM就会进行加载,如果不使用,会造成大量的资源浪费,单例模式能够实现懒加载,能够在使用实例的时候才去创建实例.开发工具类库中的很多工具类都应用了单例模式,比例线程池.缓存.日志对象等,它们都只需要创建一个对象,如果创建多份实例,可能会带来不可预知的问题,比如资源的浪费.结果处理不一致等问题. 7种

我所知道的IaaS、Paas和SaaS

我所知道的IaaS.Paas和SaaS 首先我们从百科中了解到云服务的概念. 云服务是基于互联网的相关服务的增加.使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源.云是网络.互联网的一种比喻说法.过去在图中往往用云来表示电信网,后来也用来表示互联网和底层基础设施的抽象.云服务指通过网络以按需.易扩展的方式获得所需服务.这种服务可以是IT和软件.互联网相关,也可是其他服务.它意味着计算能力也可作为一种商品通过互联网进行流通. 公有云和私有云 简单来说,云服务可以将企业所需的软

Swift 2.0学习笔记(Day5)——我所知道的标识符和关键字

Swift 2.0学习笔记(Day5)--我所知道的标识符和关键字   原创文章,欢迎转载.转载请注明:关东升的博客 好多计算机语言都有标识符和关键字,一直没有好好的总结,就是这样的用着,现在小小的整理一下Swift中的标识符和关键字. 什么是标识符呢? 标识符就是给变量.常量.方法.函数.枚举.结构体.类.协议等由开发人员指定的名字. 其实,构成标识符的字母是有一定规范的,Swift中命名规则是: 区分大小写,Myname与myname是两个不同的标识符: 标识符首字符可以以下划线(_)或者字

《从零開始学Swift》学习笔记(Day5)——我所知道的标识符和keyword

?? Swift 2.0学习笔记(Day5)--我所知道的标识符和keyword   原创文章,欢迎转载.转载请注明:关东升的博客 好多计算机语言都有标识符和keyword,一直没有好好的总结,就是这种用着,如今小小的整理一下Swift中的标识符和keyword. 什么是标识符呢? 标识符就是给变量.常量.方法.函数.枚举.结构体.类.协议等由开发者指定的名字. 事实上.构成标识符的字母是有一定规范的,Swift中命名规则是: 区分大写和小写.Myname与myname是两个不同的标识符: 标识

我所知道的MVVM框架(转 司徒大大 )

RubyLouvre commented on 6 Sep 2014 avalon http://avalonjs.github.io/ (使用Object.defineProperties. VBScript. Object.observe,纯事件驱动,兼容IE6,DOM的兼容性处理可与jQuery媲美,体积少) 早期的四大MVVM框架,都有大公司引衔 https://angularjs.org/ (google出品,思想来自flex,IoC, 脏检测,自定义标签,受限于绑定数量,一般不能超过