Java写一个安全的单例模式_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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值