单例模式

概述

单例模式(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 条评论
登录 后参与评论

相关文章

来自专栏西安-晁州

日期加减一天

对数据库查询出的datetime格式的时间数据做范围查询时,如果直接使用如下"<="方式比较的话,会出现查询结果不包含截止时间的问题,一个小技巧是直接给当前时间...

1940
来自专栏闻道于事

单例模式你会几种写法?

945
来自专栏Phoenix的Android之旅

Java 单例的五种写法

单例的目的是为了保证某个类只实例化一个对象。对于我们来说,理解这些单例写法的不同点,最好的方法是明白他们在什么情况下会失效。

701
来自专栏Java架构沉思录

聊聊设计模式之单例模式(上)

前言 单例模式应该是设计模式中最容易理解也是用得最多的一种模式了,同时也是面试的时候最常被问到的模式。单例模式的作用就是确保在任何情况下都只有一个实例对象,并提...

3326
来自专栏Spark学习技巧

常见的几种单例模式

844
来自专栏chenssy

【死磕Java并发】-----Java内存模型之从JMM角度分析DCL

DCL,即Double Check Lock,即双重检查锁定。其实DCL很多人在单例模式中用过,LZ面试人的时候也要他们写过,但是有很多人都会写错。他们为什么会...

1103
来自专栏编程之旅

iOS设计模式系列:单例设计模式

单例设计模式从字面意思上来说,就是一个类在系统运行时,只创建一个实例。可以用于需要被多次调用的或者多次使用的资源中。比如我们常见的网络请求类、工具类等等。

663
来自专栏chenssy

【死磕Java并发】—–Java内存模型之从JMM角度分析DCL

DCL,即Double Check Lock,中卫双重检查锁定。其实DCL很多人在单例模式中用过,LZ面试人的时候也要他们写过,但是有很多人都会写错。他们为什么...

38811
来自专栏微信公众号:Java团长

Hi,我们再来聊一聊Java的单例吧

单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现的——基本上每个开发者都能够随手写出——但是,真的是这样吗? 作为一个Java...

541
来自专栏小勇DW3

Java设计模式-单例模式

作为对象的创建模式,单例模式确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。单例模式有以下特点:

925

扫码关注云+社区