
前言占坑
一直想要回顾一下基础,最终想到了通过刷面试笔试题来回顾基础的方法。 计划是 包括笔试面试常见的基础知识题目,算法题目来回顾基础,好好的打牢基础~ 已经知其然,现在需要知其所以然啦~
一、 单例模式
- 首先简单介绍一下单例模式(Singleton pattern):
单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”
(PS上面那个定义百度百科里面这样写的,好多博客也是这样写的,找了半天发现就是这本书: 《Design patterns》,英文原文:Ensure a class only has one instance, and provide a global point of access to it.)
Java中单例模式定义(来自《Java与模式》):“作为对象的创建模式[GOF95],一个类有且仅有一个实例,并且自行实例化向整个系统提供这个实例。这个类称为单例”
- 单例模式的特点:
1.单例类只能有一个实例。
2.单例类必须自己创建自己的唯一实例。
3.单例类必须给所有其他对象提供这一实例。
- JAVA单例模式 详细介绍可以看这里: http://www.runoob.com/design-pattern/singleton-pattern.html
二、JAVA中单例模式的几种实现方式
三、 单例模式在多线程中的问题
3.1 单例在多线程中存在的问题
3.2 解决办法有两个
- 一种是使用synchronized关键字
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) { //双重检查锁定,延迟初始化
singleton = new Singleton();
}
}
}
return singleton;
}
2:另一种是通过内部静态类来获取
public class Singleton {
private static Singleton singleton;
public static Singleton getInstance() {
return SingletonHolder.mSingleton;
}
private static class SingletonHolder {
private static final Singleton mSingleton = new Singleton();
}
}
相关链接
原创文章,作者:宁白久,如若转载,请注明出处:《单例中的多线程问题怎么解决》https://www.liangrenyixin.cn/article/p/2543242851681288
全部评论: 条