单例模式

概述

单例模式(Singleton Pattern),创建对象模式之一,单例模式确保一个类只能创建一个实例。单例模式适用于一个系统要求一个类只有一个实例时,比如Swing窗体,只需要一个实例。如果一个类可以同时存在多个实例,那就不需要使用单例模式。单例模式很容易被滥用。下面看一下代理模式的几种实现方式。

实现

实现单例模式要两点,一是不能让外界创建对象,所以需要构造器私有化;二是需要提供得到单例对象的方法。

饿汉模式

/**

* 单例之饿汉模式

*/

public class Singleton {

private static Singleton instance = new Singleton();

private Singleton() {}

public static Singleton getInstance() {

return instance;

   }

}

该模式是类加载的的时候创建好一个静态对象,不管使用不使用,对象已经创建好了,并且是线程安全的。

懒汉模式

/**

* 单例之懒汉

*/

public class Singleton {

private static Singleton instance;

private Singleton() {}

public static synchronized Singleton getInstance() {

if (instance ==null) {

instance = new Singleton();

      }

return instance;

   }

}

该模式很懒,不用的时候不会创建对象,只有用的时候才会创建,但在多线程的情况下,需要让方法互斥,才能保证只会创建一个实例,如果不加synchronized,当多个线程同时获取实例时,就有可能创建多个实例。(可以测试一下)

双重锁定

/**

* 双重锁定

*/

public class Singleton {

private static Singleton instance;

private Singleton() {}

public static Singleton getInstance() {

if (instance ==null) {

synchronized (Singleton.class) {

if  (instance ==null) {

instance =new Singleton();

           }

        }

      }

return instance;

   }

}

第一个instance == null是判断当前是否为空,如果为空才对创建实例的代码块上互斥锁,第二个instance == null是两个线程互斥了,第一个线程创建完对象,第二个线程直接返回。这种方式是在懒汉模式上的一个进化,避免了无用的互斥开销。这个是在《大话设计模式》上看到的,大话是用的C#,百度一下,这种方式不适用于java,基于java内存模型有时会失效,我没想明白什么时候会失效,明天再研究下。

总结

单例模式由于构造器是私有化的,所以单例的类不能被继承。优缺点分析,饿汉模式,类加载的时候就会创建单例对象,保证了多线程情况下的单例,同时有可能这个单例对象永远也不会被用到;懒汉模式,只有用到单例的时候才会创建对象,不用就不会创建,多线程情况下互斥开销较大。使用哪种情况全凭自己爱好,企业级应用应该不会在这点内存上耗费时间。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

C++模板特化与偏特化

模板特化(template specialization)不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板的特化。模板特化有时也称之为模板的具体化...

1174
来自专栏用户画像

软件测试之 控制流图 圈复杂度 独立路径 测试用例

例题:void Sort ( int  iRecordNum, int iType)

672
来自专栏前端儿

一种排序

现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大...

742
来自专栏云霄雨霁

设计模式----单例模式

1370
来自专栏编程之路

羊皮书APP(Android版)开发系列(二十二)10分钟秒懂单例模式

793
来自专栏Python小屋

使用Python查看汉诺塔移动详细过程

汉诺塔属于比较经典的问题,详见以前的文章Python模拟汉诺塔问题移动盘子的过程,基于非递归算法的汉诺塔游戏之Python实现。 本文代码功能:模拟移动汉诺塔上...

3586
来自专栏java工会

java设计模式-单例模式

1676
来自专栏Leetcode名企之路

【设计模式】单例模式

前几天面试一个校招的小朋友,让他写单例模式,没写出来,所以这里把两年前我的学习笔记发一下。这应该是所有设计模式中最简单的设计模式了,从它讲起。

953
来自专栏Java后端技术

你敢说自己了解单例模式?

  最近在学习设计模式,在看到单例模式的时候,我一开始以为直接很了解单例模式了,实现起来也很简单,但是实际上单例模式有着好几个变种,并且多线程中涉及到线程安全问...

782
来自专栏偏前端工程师的驿站

不懂JQuery的孩子:自封装Ajax函数

前言                                       一直没痛下决心学习JQuery,但平时项目中又要用到Ajax,于是自己写一个...

32210

扫码关注云+社区