单例模式中的多线程安全问题分析
2023-09-11 14:21:58 时间
单例模式中的多线程安全问题分析
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(),此时内存中会存在两个对象
*怎么解决?
*添加同步代码块
相关文章
- java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
- 40个Java多线程问题总结
- java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列
- spring boot 2X中@Scheduled实现定时任务及多线程配置
- java多线程(一)——线程安全的单例模式
- java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列
- Java多线程安全问题解决的两种方式代码案例
- C# 多线程
- 【手写Tomcat】3.实现多线程
- Qt多线程间的互斥
- Qt如何保证类的线程安全?(让多线程不再崩渍)
- 多线程安全问题原理和4种解决办法
- 5招教你实现多线程场景下的线程安全!
- 借助SimpleDateFormat来谈谈java里的多线程不安全
- QT-多线程与界面之间交互总结
- 006-多线程-集合-Set-ConcurrentSkipListSet
- 001-多线程-JUC集合-框架概述
- 在LabVIEW中为何要关闭多线程
- 多线程的并发一般不是程序员决定,而是由容器决定。
- 多线程有几种实现方法,都是什么?同步的方法有几种,都是什么?
- C#多线程实践-锁和线程安全