专栏首页微光点亮星辰浅淡Java设计模式之单例模式

浅淡Java设计模式之单例模式

什么是单例模式? 保证一个类仅有一个实例,并提供一个访问它的全局访问点. java中的单例:一个类有且仅有一个实例,并且自行实例化向整个系统提供。

  1. Java创建单例模式的原则 2.1 必须提供一个私有静态化的成员变量 2.2 必须提供一个私有的构造器 2.3 必须有提供一个公共的静态方法给外部访问该对象
  2. Java创建单例模式的几种情况 3.1 饿汉模式 所谓饿汉模式就是默认把所有东西都加载好等待外界来取(该类创建的单例对象,在类加载阶段即创建)代码如下:
package com.design.singleton;/**Java设计模式系列
* 设计模式一:单例模式之饿汉式
* @author 36963
*
*/public class Singleton {   /*私有化构造函数,并创建一个对象,该对象为唯一的*/
   private static Singleton instance = new Singleton();    private Singleton(){}    /*提供一个public的方法访问这个对象*/
   public static Singleton getInstance(){        return instance;
   }

这种模式,在类加载阶段就把对象创建好了,效率比较快,但是代价也比较大,会产生很多不用的对象,堆积在内存中,造成浪费。一般我们会采用lazy-reload模式,即调用 的时候创建,下一种模式 3.2 懒汉模式 所谓饱汉模式,即我想用的时候再取,不是先创建好在用。代码如下:

/** * 懒汉式的延迟加载机制 * @author 36963 * */public class Singleton3 { private static Singleton3 instance; private Singleton3 (){ } public static Singleton3 getInstance(){ if(instance == null){ instance = new Singleton3(); } return instance; } }

对于这种模式弥补了第一种模式的不足,但是又有新的缺陷,当进入多线程的模式下,如果两个线程都同时进入if条件语句,则有可能会产生两个不同的对象,所以,下面可以进行改进: 3.3 懒汉锁机制 学过多线程的都知道,一般防止线程并发的方法可以用synchronized关键字。ps:synchronized有多少会拼的???? 代码如下:package com.design.singleton;/** * 线程安全之懒汉式 * @author 36963 * */public class SynchronizedSingleton { private static SynchronizedSingleton instance; private SynchronizedSingleton(){ } public static synchronized SynchronizedSingleton getInstance(){ if(instance == null){ instance = new SynchronizedSingleton(); } return instance; } }

显然上面的代码解决了多线程并发问题,但是出现了,效率问题,synchronized关键字加在方法上范围太大,造成等待的情况,故下面只需要减少范围即可代码如下:

package com.design.singleton;/** * 线程安全懒汉式改进 双重校验锁 * @author 36963 * */public class Singleton4 { // 有一种替代模式 private static Singleton4 instance; //private static volatile Singleton4 instance; private Singleton4(){} public static Singleton4 getInstance(){ if(instance == null){ synchronized (Singleton4.class) { if(instance == null){ instance = new Singleton4(); } } } return instance; } }对于这种模式,我们用的较多了,效率上影响不大,比较好。但是如果在Java对象序列化和反序列化中,则稍显不足,会破坏单例模式,我们给予稍稍改进即可:我们创建成员变量的时候使用voiatile声明//private static volatile Singleton4 instance;即可。 但是为了更好的体现程序猿们的编程水平可以使用下面的方式一站式解决上面的问题:使用静态内部类的方式创建,代码如下: 3.4 静态内部类的模式创建package com.design.singleton;/** * 静态内部类样式 * @author 36963 * */public class StaticInnerSingleton { private static class SingletonHolder{ private static final StaticInnerSingleton INSTANCE = new StaticInnerSingleton(); } private StaticInnerSingleton(){ } public static final StaticInnerSingleton getInstance(){ return SingletonHolder.INSTANCE; } }这种方式可以解决以上几种问题。非常常用,,, 以上是我对单例模式的简单理解。。。模式系列未完待续。。。

本文分享自微信公众号 - 微光点亮星辰(SandTower),作者:刘西凤

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-09-08

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《Head First 设计模式》- 单例模式

    设计模式在代码层级中,是让你在某种业务场景刚开始设计时,能让未来的相关需求扩展极为方便的一个思想。 简单的说,在一开始设计好,扩展是很方便的,设计模式就是这个功...

    聚沙成塔
  • Linux下的文本编辑工具 - vi

    由于Linux系统“一切皆配置”的特性,我们经常要去修改各种软件及服务的配置文件,因此掌握最基本的编辑工具是十分必要的。在装了桌面的Linux系统中我们可以使用...

    聚沙成塔
  • HashMap的深刻理解

    HashMap实现了Map接口,Map接口对键值对进行映射。 Map中不允许重复的键 。

    聚沙成塔
  • Java 单例模式 五种常见的写法

    大数据工程师-公子
  • 基于TrueLicense实现产品License验证功能

    2、  授权者保留私钥,使用私钥对包含授权信息(如截止日期,MAC地址等)的license进行数字签名。

    朝雨忆轻尘
  • ASP.NET MVC升级到ASP.NET Core MVC踩坑小结

    ASP.NET Core是微软新推出的支持跨平台、高性能、开源的开发框架,它的优势不必多说,因为已经说得太多了。当然,现在依然有着数量庞大的系统运行于.NET ...

    Edison.Ma
  • C# Obsolete

    Obsolete 属性将某个程序实体标记为一个建议不再使用的实体。每次使用被标记为已过时的实体时,随后将生成警告或错误,这取决于属性是如何配置的。例如:

    aehyok
  • hibernate 一对一,一对多,多对多关联关系使用

    一对一 如果我们只是单纯的在两个实体类中分别加上@OneToOne注解,会发现两张表都分别引入了对方的主键作为外键。明显的数据冗余,毕竟关系不...

    用户5166330
  • 盒子模型

    1> padding内填充(padding在元素的边框以内,内容之外,padding会显示元素的背景) Top|right|bottom|left

    河湾欢儿
  • Spring Boot 整合Mybatis

    可以直接在Springboot的主入口处添加 @MapperScan 扫描指定路径的mapper,就不用在每个dao上都加一个@mapper 注解了。

    LCyee

扫码关注云+社区

领取腾讯云代金券