单例设计模式
发布日期:2021-06-30 18:22:46 浏览次数:3 分类:技术文章

本文共 1647 字,大约阅读时间需要 5 分钟。

单例模式 = 私有的构造方法 + 私有静态的成员变量 + 一个公有的对象返回方法

首先,第一种

饿汉式

就是在定义私有静态的成员变量的时候,就直接将对象new出来

//饿汉式//私有静态的成员变量private final static Singleton INSTANCE = new Singleton();//私有的构造方法private Singleton(){
}public Singleton getInstance(){
return INSTANCE;}

然后是第二种

懒汉式

这种方法有一个线程安全的问题

首先看一种线程不安全的情况

//懒汉式(不可使用,存在线程安全问题)//定义静态的成员变量,但不直接new出来private static Singleton instance =null;//私有的构造方法private Singleton(){
}public Singleton getInstance(){
if (instance == null) {
instance=new Singleton(); } return instance;}

这是懒汉式中最简单的一种写法,只有在方法第一次被访问时才会实例化,达到了懒加载的效果。但是这种写法有个致命的问题,这种没有加锁,存在线程安全问题。假设对象还没被实例化,然后有两个线程同时访问,那么就可能出现多次实例化的结果,所以这种写法不可采用。

解决线程安全问题,加锁!!!

在getInstance()方法上加上synchronized关键字,这样就可以达到线程安全的效果.

//懒汉式(加锁可用)//定义静态的成员变量,但不直接new出来private static Singleton instance =null;//私有的构造方法private Singleton(){
}public synchronized Singleton getInstance(){
if (instance == null) {
instance=new Singleton(); } return instance;}

保证了同一时刻只能有一个线程访问并获得实例,但是缺点也很明显,因为synchronized是修饰整个方法,每个线程访问都要进行同步,而其实这个方法只执行一次实例化代码就够了,每次都同步方法显然效率低下,为了改进这种写法,就有了下面的双重检查懒汉式。

双重检查懒汉式(可用,推荐)

//双重检查懒汉式//定义静态的成员变量,但不直接new出来private static Singleton instance = null;//私有的构造方法private Singleton() {
}//公有的获取对象的方法public Singleton getInstace() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton(); } } } return instance;}

这是很多开发者推荐的一种写法,这种静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成对象的实例化。

同时,因为类的静态属性只会在第一次加载类的时候初始化,也就保证了SingletonInstance中的对象只会被实例化一次,并且这个过程也是线程安全的。

转载地址:https://libolin.blog.csdn.net/article/details/108967166 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:学java日志框架,看这一篇就够了!!!
下一篇:每日java笔试题——2020-10-8

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月18日 14时50分02秒