多线程下的单例模式

来源:互联网 发布:淘宝选品数据分析 编辑:程序博客网 时间:2024/06/09 19:18

在所有的设计模式中,单例模式是我们在项目开发中最为常见的设计模式之一,而单例模式有很多种实现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?这篇文章主要讨论,多线程保证单例模式的线程安全。

饿汉式单例

使用饿汉式的单例,是指在方法调用前,实例就已经创建好了。在多线程下是安全的。代码如下:

public class MySingleton {    private static MySingleton instance = new MySingleton();    private MySingleton() {    }    public static MySingleton getInstance() {        return instance;    }}

线程安全的懒汉式单例

懒汉式单例是指在方法调用获取实例时才创建实例,因为相对饿汉式显得“不急迫”,所以被叫做“懒汉模式”。
在使用synchronized的情况下,懒汉式单例是线程安全的。代码如下:

public class MySingleton {    private static MySingleton instance = null;    private MySingleton() {    }    public static synchronized MySingleton getInstance() {        if (instance == null) {// 懒汉式            instance = new MySingleton();        }        return instance;    }}

Double Check Locking 双检查锁机制(推荐)

为了达到线程安全,又能提高代码执行效率,我们这里可以采用DCL的双检查锁机制来完成,代码实现如下:

public class MySingleton {    private static MySingleton instance = null;    private MySingleton() {    }    public static MySingleton getInstance() {        if (instance == null) {// 第一次检查            synchronized (MySingleton.class) {                if (instance == null) {// 二次检查                    instance = new MySingleton();                }            }        }        return instance;    }}

使用内部类的方式

DCL解决了多线程并发下的线程安全问题,其实使用其他方式也可以达到同样的效果,代码实现如下:

public class MySingleton {    private static class MySingletonHandler {// 内部类        private static MySingleton instance = new MySingleton();    }    private MySingleton() {    }    public static MySingleton getInstance() { // 获取单例        return MySingletonHandler.instance;    }}
1 0
原创粉丝点击