单例模式
来源:互联网 发布:郑秀晶崔雪莉关系知乎 编辑:程序博客网 时间:2024/06/01 21:38
懒汉式
public class LHanDanli { //定义一个私有类变量来存放单例,私有的目的是指外部无法直接获取这个变量,而要使用提供的公共方法来获取 private static LHanDanli dl = null; //定义私有构造器,表示只在类内部使用,亦指单例的实例只能在单例类内部创建 private LHanDanli(){} //定义一个公共的公开的方法来返回该类的实例,由于是懒汉式,需要在第一次使用时生成实例,所以为了线程安全,使用synchronized关键字来确保只会生成单例 public static synchronized LHanDanli getInstance(){ if(dl == null){ dl = new LHanDanli(); } return dl; } }饿汉式
public class EHanDanli { //此处定义类变量实例并直接实例化,在类加载的时候就完成了实例化并保存在类中 private static EHanDanli dl = new EHanDanli(); //定义无参构造器,用于单例实例 private EHanDanli(){} //定义公开方法,返回已创建的单例 public static EHanDanli getInstance(){ return dl; } }双重加锁机制.在懒汉式实现单例模式的代码中,有使用synchronized关键字来同步获取实例,保证单例的唯一性,但是上面的代码在每一次执行时都要进行同步和判断,无疑会拖慢速度,使用双重加锁机制正好可以解决这个问题:
public class SLHanDanli {//这里的双重指的的双重判断 private static volatile SLHanDanli dl = null; private SLHanDanli(){} public static SLHanDanli getInstance(){ if(dl == null){ synchronized (SLHanDanli.class) { if(dl == null){ dl = new SLHanDanli(); } } } return dl; } }静态内部类:(推荐)
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } } //其实使用静态初始化器的方式会在类加载时创建类的实例,但是我们将实例的创建显式放置在静态内部类中,它会导致在外部类加载时不进行实例创建,这样就能实现我们的双重目的:延迟加载和线程安全。
阅读全文
0 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- scrapy自定义RetryMiddleware
- 第七章 使用prototype Cell定制Table View(二)
- Log4j输出格式控制--log4j的PatternLayout参数含义
- poj1523—SPF(tarjan算法求无向图中所有的割点)
- 华为机试——字符串分隔
- 单例模式
- CSS3 transform
- Spring MVC概述
- 手动触发链接
- Train Problem II(卡特蘭數)
- Xshell连接虚拟机linux系统
- appcan 笔记
- 查询某个字段重复的sql:
- Mybatis特别注意int类型的数据判断