单例模式中的多线程安全问题分析

单例模式中的多线程安全问题分析

2018年04月23日 22:17:31 luowei201711 阅读数 55

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luowei201711/article/details/80057528

package thread2;

public class SingleTonDemo {

    public static void main(String[] args) {
        SingleTon single = SingleTon.getSingle();
        SingleTon single1 = SingleTon.getSingle();
        System.out.println(single1.equals(single));
    }
}


package thread2;


/* 单例设计模式:一个类只允许一个对象存在

* 分析:(1)构造函数私有化,不让外界创建该类的对象

* (2) 既然不让外界去创建,那么就应该在本类中提供该类的对象

* 懒汉式:

* 延时加载

* 饿汉式:

*/

public class SingleTon {

private SingleTon() {

};

private static SingleTon single = null;

public static SingleTon getSingle() {

if (single == null) {

synchronized (SingleTon.class) { //该类的字节码对象作为同步代码块的锁

if (single == null) {

// 加了同步后,不会出现多个线程在此处发生阻塞

single = new SingleTon();

}

}

}

return single; //single!=null时,直接返回,降低同步代码块的判断次数

}

}

/*

*问题:

*当多个线程共同访问getSingle()时,会出现安全问题,假设线程A,B同时在if判断后发生阻塞,恢复正常后,AB都会执行single = newSingleTon(),此时内存中会存在两个对象

*怎么解决?

*添加同步代码块

 

posted @   grj001  阅读(132)  评论(0编辑  收藏  举报
编辑推荐:
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
阅读排行:
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 程序员转型AI:行业分析
· 深入集成:使用 DeepSeek SDK for .NET 实现自然语言处理功能
· 为DeepSeek添加本地知识库
· .NET程序员AI开发基座:Microsoft.Extensions.AI
点击右上角即可分享
微信分享提示