单例模式

概述

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

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Oracle存储过程

Oracle存储过程 oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数...

3715
来自专栏Java Edge

2018-08-24

函数可以嵌入在sql中使用的,可以在select中调用 存储过程要让sql的query 可以执行, 需要把 mysql_real_connect 的最后一个参...

542
来自专栏hrscy

SQLite 基础

第1页:limit 0, 5 第2页:limit 5, 5 第3页:limit 10, 5 … 第n页:limit 5*(n-1), 5

1444
来自专栏Ryan Miao

Mybatis高级查询之关联查询

learn from:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps 关联查询 ...

65414
来自专栏逸鹏说道

SQL Server 索引和表体系结构(聚集索引+非聚集索引)

聚集索引 概述 关于索引和表体系结构的概念一直都是讨论比较多的话题,其中表的各种存储形式是讨论的重点,在各个网站上面也有很多关于这方面写的不错的文章,我写这...

3189
来自专栏积累沉淀

Oracle、 Mysql 、 SQLserver 分页查询

MYSQL 分页最简单了. SELECT * FROM Account  WHERE (usertype='base' or usertype=...

2505
来自专栏LanceToBigData

MySQL(九)之数据表的查询详解(SELECT语法)二

上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等。希望大家能都得到帮助! 在开始...

19810
来自专栏十月梦想

mysql字段名

字段属性:null/not null,primary key,auto_increment,unique key,comment,default

662
来自专栏跟着阿笨一起玩NET

SQL Server不区分大小写的问题

  默认情况下,SQL Server不区分大小写,如果数据表TEST的TNAME列中有数据“abcd”和“Abcd”, 如果使用查询语句:select * fr...

1772
来自专栏JMCui

MySQL数据库规约.

一、建表规约 1、表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是, 0 表示否) 。 2、表...

3325

扫码关注云+社区