文档章节

单例模式

u
 udbwcso
发布于 2016/03/24 16:47
字数 448
阅读 63
收藏 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
粉丝 81
博文 66
码字总数 15709
作品 0
武汉
私信 提问

暂无文章

发布xxl-job executor dotnet core 执行器的实现

DotXxlJob [github][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+ 1 XXL-JOB概述 [XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标...

假正经哥哥
今天
2
0
mysql 查询当天、本周,本月,上一个月的数据

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 wher......

BraveLN
今天
3
0
Spring 事务初始化源码分析

相关文章 Spring 事务使用详解 Spring AOP 创建代理的源码解析 Spring AOP 注解方式源码解析 Spring AOP 功能使用详解 Spring 的 getBean 方法源码解析 Spring bean 创建过程源码解析 Spring...

TSMYK
今天
1
0
Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构

前面几节中,都是通过java层调用到jni中,jni向下到c++层并未介绍 看下Java层一个方法在c++层 MediaPlayer后续过程 frameworks/av/media/libmedia/MediaPlayer.cpp 找一个我们之前熟悉的setDa...

天王盖地虎626
今天
3
0
【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)

1、前言   框框博客在线报时:2018-11-07 19:31:06   当前MySQL最新版本:8.0.13 (听说比5.7快2倍)   官方之前表示:MySQL 8.0 正式版 8.0.11 已发布,MySQL 8 要比 MySQL 5.7 快 2 ...

Code辉
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部