关于多线程在简单的懒汉模式下线程安全问题的解决
来源:互联网 发布:量化投资算法 编辑:程序博客网 时间:2024/06/03 19:04
一个简单的懒汉模式,例如:
public class SingleTonDemo {
public static void main(String[] args) { // TODO Auto-generated method stub SingleTon singleTong1=SingleTon.getInstance(); SingleTon singleTong2=SingleTon.getInstance(); System.out.println(singleTong1+" "+singleTong2);}
}
//单例类——懒汉模式
class SingleTon{
private static SingleTon singleTon=null;
private SingleTon() { System.out.println("懒汉模式");}public static SingleTon getInstance(){ if(singleTon==null){ singleTon=new SingleTon(); } return singleTon;}
}
这样单例类被调用的时候仅会提供一个实例,可是在运用上多线程后却不一定了
代码如下:
public class SingleTonDemo {
public static void main(String[] args) { // TODO Auto-generated method stub SingleTonThread STT=new SingleTonThread(); Thread thread1=new Thread(STT); Thread thread2=new Thread(STT); thread1.start(); thread2.start();}
}
//线程类
class SingleTonThread implements Runnable{
//重写run方法@Overridepublic void run() { SingleTon.getInstance();}
}
//单例类——懒汉模式
class SingleTon{
private static SingleTon singleTon=null;
private SingleTon() { System.out.println("懒汉模式");}public static SingleTon getInstance(){ if(singleTon==null){ singleTon=new SingleTon(); } return singleTon;}
}
这样的情况下,运行会发现单例类提供了两个实例,那么这个单例模式就存在安全问题了,为了解决问题,只需要将单例类的getInstance方法做成同步代码块即可
代码如下:
public static SingleTon getInstance(){
//多一层判断,减少调用synchronized关键字的次数,提高代码效率
if (singleTon==null) {
//由于是在静态方法内,所以无法使用this关键字锁定当前类,所以使用class模板类对象
synchronized (SingleTon.class) {
if(singleTon==null){
singleTon=new SingleTon();
}
}
}
return singleTon;
}
这样就不会出现懒汉模式创建多个实例的问题了
本人新手,如若有错误或需要改进的地方,还请各位大神指点。
- 关于多线程在简单的懒汉模式下线程安全问题的解决
- 懒汉式单例模式的线程安全问题
- 懒汉单例模式在多线程下的应用
- 解决单例设计模式中的懒汉设计模式存在线程安全问题(并且在一定程度上提高效率)的一种解决方法
- 简单java单例模式 懒汉式、饿汉式以及解决线程安全问题(synchronized)
- 多线程下的懒汉式单例模式
- java---懒汉式的线程安全问题
- 解决单例设计模式中懒汉式线程安全问题
- 解决单例设计模式中懒汉式线程安全问题
- Java 多线程学习笔记(十一) 单例设计模式(延迟加载/懒汉模式)DCL解决线程安全问题
- 多线程:线程的安全问题
- 单例在多线程下的问题: "懒汉"初始化的线程安全
- 多线程简单实现与线程安全问题的简单处理
- 单例模式的懒汉式在多线程的问题
- 单例懒汉式的多线程操作的安全问题
- 多线程-线程安全问题的产生原因分析以及同步代码块的方式解决线程安全问题
- 多线程下的单例模式(懒汉式)
- 【面试题】懒汉式的多线程安全问题解决方案
- 求助,oracle的connect by功能转换到mysql如何
- python 文件读写异常 [已解]
- 数据库SQL语句 SELECT LIKE like用法详解
- 案例一:基于MapReduce求每年的最大天气
- shiro基础学习(二)—shiro认证
- 关于多线程在简单的懒汉模式下线程安全问题的解决
- linux CentOS7 安装mysql
- tomcat 配置 OutOfMemoryError: Java heap space OutOfMemoryError: PermGen space OutOfMemoryError: unable
- NAT技术基本知识
- [Leetcode] 282. Expression Add Operators 解题报告
- 桥接模式
- kettle连接sqlserver问题
- PhP中的匿名函数与use
- 使用librtmp推送AVC数据——Android端