单例中的多线程问题怎么解决

前言占坑

一直想要回顾一下基础,最终想到了通过刷面试笔试题来回顾基础的方法。 计划是 包括笔试面试常见的基础知识题目,算法题目来回顾基础,好好的打牢基础~ 已经知其然,现在需要知其所以然啦~

一、 单例模式

  • 首先简单介绍一下单例模式(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中单例模式的几种实现方式

三、 单例模式在多线程中的问题

3.1 单例在多线程中存在的问题

3.2 解决办法有两个

  1. 一种是使用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();
    }

}

相关链接