JAVA面试经典合集2:怎样写出一个线程安全的单例模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA面试经典合集2:怎样写出一个线程安全的单例模式相关的知识,希望对你有一定的参考价值。

怎样写出一个线程安全的单例模式

package com.chendan.mianshi;

/**
 * 
 * 
 * @Description
 * @author ChenDan 624665255@qq.com
 * @date 2019年8月4日下午8:47:13
 *
 */

public class MianShiTest2 
    public static void main(String[] args) 
        // com.chendan.mianshi.SingleTon@1c53fd30
        // com.chendan.mianshi.SingleTon@1c53fd30
        // 可以看到结果一样
        getInstanceEhs();

        // com.chendan.mianshi.SingleTon2@282ba1e
        // com.chendan.mianshi.SingleTon2@282ba1e
        getInstanceLhs();

        //com.chendan.mianshi.SingleTon3@f5f2bb7
        //com.chendan.mianshi.SingleTon3@f5f2bb7
        getInstanceLhs2();

    

    // 饿汉式方法
    public static void getInstanceEhs() 
        // 调用GetInstance直接返回一个instance对象,且是唯一的
        SingleTon instance1 = SingleTon.getInstance();
        SingleTon instance2 = SingleTon.getInstance();
        // com.chendan.mianshi.SingleTon@1c53fd30
        System.out.println(instance1);
        // com.chendan.mianshi.SingleTon@1c53fd30
        System.out.println(instance2);
    

    // 懒汉式方法

    public static void getInstanceLhs() 
        // 调用getInstance直接返回一个instance对象,且是唯一的
        SingleTon2 instance1 = SingleTon2.getInstance();
        SingleTon2 instance2 = SingleTon2.getInstance();
        // ccom.chendan.mianshi.SingleTon2@cad498c
        System.out.println(instance1);
        // com.chendan.mianshi.SingleTon2@cad498c
        System.out.println(instance2);
    

    public static void getInstanceLhs2() 
        // 调用getInstance直接返回一个instance对象,且是唯一的
        SingleTon3 instance1 = SingleTon3.getInstance();
        SingleTon3 instance2 = SingleTon3.getInstance();
        // com.chendan.mianshi.SingleTon2@cad498c
        System.out.println(instance1);
        // com.chendan.mianshi.SingleTon2@cad498c
        System.out.println(instance2);
    



//饿汉式直接初始化方法
class SingleTon 

    private SingleTon() 

    

    // 饿汉式直接静态初始化,保证唯一,但是初始类时就加载内存,性能稍低
    private static SingleTon instance = new SingleTon();

    // 创建直接返回线程方法
    public static SingleTon getInstance() 
        return instance;
    



//懒汉式静态内部类初始化方法
class SingleTon2 

    private SingleTon2() 
    

    private static class Singleton2Holder 
        public final static SingleTon2 instance = new SingleTon2();
    

    public static SingleTon2 getInstance() 
        return Singleton2Holder.instance;
    



class SingleTon3 

    private SingleTon3() 
    

    public static SingleTon3 instance = null;

    public static SingleTon3 getInstance() 

        if (instance == null) 
            synchronized (SingleTon3.class) 
                if (instance == null) 
                    instance = new SingleTon3();
                
            
        

        return instance;

    

总结:最优方法为内部静态类的方法,即方法2

以上是关于JAVA面试经典合集2:怎样写出一个线程安全的单例模式的主要内容,如果未能解决你的问题,请参考以下文章

如何写一个简单的单例模式?

怎么实现一个线程安全的单例模式

如何写出面试官欣赏的Java单例

线程安全的单例模式是否真的安全

JAVA如何正确地写出单例模式(转)

三单例模式详解