文档章节

单例模式

u
 udbwcso
发布于 2016/03/24 16:47
字数 448
阅读 62
收藏 3

单例模式

确保一个类只有一个实例,并提供一个全局访问点.

1.饿汉

public class Singleton {
    private static Singleton uniqueInstance = new Singleton();

    public static Singleton getInstance() {
        return uniqueInstance;
    }

    private Singleton() {
    }
}
public class Singleton {
    private static Singleton uniqueInstance;

    static {
        uniqueInstance = new Singleton();
    }

    public static Singleton getInstance() {
        return uniqueInstance;
    }

    private Singleton() {
    }
}

没有实现懒加载.

2.懒汉

public class Singleton {
    private static Singleton uniqueInstance;

    public static Singleton getInstance() {
        if(uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }

    private Singleton() {
    }
}

线程不安全,在多线程的情况下可能会出现多个实例.

public class Singleton {
    private static Singleton uniqueInstance;

    public static synchronized Singleton getInstance() {
        if(uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }

    private Singleton() {
    }
}

通过增加synchronized关键字到getInstance()方法中,使每个线程在进入这个方法之前要先等候别的线程离开这个方法,也就是说不会有两个线程同步进入这个方法.但同步会降低性能并且只有第一执行此方法时才需要同步,设置好uniqueInstance这个变量后就不需要再同步这个方法.

3.静态内部类

public class Singleton {

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private Singleton() {
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
}

这种方式利用classloder的机制来保证初始化instance时只有一个线程,饿汉只要Singleton类被装载了,instance就会被实例化,没有达到lazy loading效果,而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有通过调用getInstance方法,才会装载SingletonHolder类,从而实例化instance。

4.双重检查加锁

public class Singleton {
    private volatile static Singleton uniqueInstance;

    public static Singleton getInstance() {
        if(uniqueInstance == null){
            synchronized(Singleton.class) {
                if(uniqueInstance == null){
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }

    private Singleton() {
    }
}

关于volatile可参考:Java 理论与实践: 正确使用 Volatile 变量

5.枚举

public enum Singleton {
    INSTANCE;
    public void doSomething(){
        
    }
}


© 著作权归作者所有

共有 人打赏支持
上一篇: 策略模式
下一篇: 工厂模式
u
粉丝 80
博文 66
码字总数 15709
作品 0
武汉
私信 提问

暂无文章

OSChina 周日乱弹 —— 懒床是对冬天最起码的尊重

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念 :分享daniwellP/桃音モモ的单曲《Nyan Cat》 《Nyan Cat》- daniwellP/桃音モモ 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪...

小小编辑
今天
27
2
码云项目100,水一发

简单回顾一下: 早期构想最多的,是希望能将PHP一些类和编码分区做得更细,所以很多尝试。但不得不说,PHP的功能过于单一,是的,也许写C/C++扩展,可以解决问题,那我为什么不用C#或者Golan...

曾建凯
今天
4
0
Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部