实现线程安全的单例模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现线程安全的单例模式相关的知识,希望对你有一定的参考价值。

一、双检查锁机制

package singleton;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 双检查锁机制--单例模式
 * Created by daizengjie on 2017/8/29.
 */
public class MySingleton {

    private static final Logger logger = LoggerFactory.getLogger(MySingleton.class);

    //使用volatile关键字会强制将修改值写入主存
    //并发三要素:原子性(synchronized,Lock)、可见性(volatile)、有序性(重排序,happens-before原则,valotile)

    //Lock lock = new ReentrantLock()
    //lock.lock()
    //lock.unlock()   try..finally..

    volatile private static MySingleton instance = null;

    private MySingleton(){}

    public static MySingleton getInstance(){
        try {
            if(instance != null){//懒汉式

            }else{
                //准备性耗时
                Thread.sleep(300);
                synchronized (MySingleton.class){
                    if(instance == null){//二次检查
                        instance = new MySingleton();
                    }
                }
            }
        } catch (InterruptedException e) {
            logger.error(e.getMessage());
        }

        return instance;
    }
}

二、内部类实现

package singleton;

import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 * 内部类实现单例模式
 * 反序列化与序列化前,需要同一个实例
 * Created by daizengjie on 2017/8/29.
 */
public class InnerClassSingleton implements Serializable{

    private static final long serialVersionUID = 1L;

    //内部类
    private static class MySingletonHandler{
        private static InnerClassSingleton instance = new InnerClassSingleton();
    }

    private InnerClassSingleton(){}

    public static InnerClassSingleton getInstance(){
        return MySingletonHandler.instance;
    }

    //反序列化之前会被调用
    protected Object readResolve() throws ObjectStreamException{
        return MySingletonHandler.instance;
    }
}

 

以上是关于实现线程安全的单例模式的主要内容,如果未能解决你的问题,请参考以下文章

多线程 实现单例模式 ( 饿汉懒汉 ) 实现线程安全的单例模式 (双重效验锁)

Java线程安全的单例模式的几种实现

java 实现线程安全的单例模式

多线程阻塞队列定时器线程安全的单例模式的原理及实现

多线程阻塞队列定时器线程安全的单例模式的原理及实现

多线程阻塞队列定时器线程安全的单例模式的原理及实现