解决单例设计模式中懒汉式线程安全问题
来源:互联网 发布:淘宝上的装修公司 编辑:程序博客网 时间:2024/04/29 10:19
---------------------------------------- android培训、 java培训 、期待与您交流! -----------------------------------------
首先写个单例:
public class SingleDemo {private static SingleDemo s = null;private SingleDemo(){}public static SingleDemo getInstance(){if(s == null){s = new SingleDemo();}return s;}}
写个测试类:
public class ThreadDemo3 {public static void main(String[] args) {SingleDemo s1 = SingleDemo.getInstance();SingleDemo s2 = SingleDemo.getInstance();System.out.println(s2 == s2);}}
运行结果一直都是true,说明单线程下是没问题的,下面写个多线程来访问单例
public class ThreadTest implements Runnable {//存放单例对象,使用Set是为了不存放重复元素public Set<SingleDemo> singles = new HashSet<SingleDemo>();@Overridepublic void run() {//获取单例SingleDemo s = SingleDemo.getInstance();//添加单例singles.add(s);}}
使用多线程并发访问单例:
public class ThreadDemo3 {public static void main(String[] args) {//SingleDemo s1 = SingleDemo.getInstance();//SingleDemo s2 = SingleDemo.getInstance();//System.out.println(s2 == s2);ThreadTest t = new ThreadTest();new Thread(t).start();new Thread(t).start();new Thread(t).start();new Thread(t).start();new Thread(t).start();new Thread(t).start();new Thread(t).start();new Thread(t).start();System.out.println(t.singles);}}运行结果如下:
[com.persagy.thread.SingleDemo@1bc4459, com.persagy.thread.SingleDemo@150bd4d]
或
[com.persagy.thread.SingleDemo@12b6651]
说明有线程并发访问安全问题,获取的不一定都是同一个实例
如何解决线程安全问题呢?
当然使用同步锁机制了啊
下面改进单例:
public class SingleDemo {private static SingleDemo s = null;private SingleDemo(){}public static synchronized SingleDemo getInstance(){if(s == null){s = new SingleDemo();}return s;}}加入同步函数后线程安全问题解决了
运行多次都是获取同一个实例,不会出现2个实例的情况了
[com.persagy.thread.SingleDemo@12b6651]
但是在多线程并发访问的情况下,每个线程每次获取实例都要判断下锁,效率比较低,为了提高效率,我加入了双重判断的方法,解决了效率的问题
代码如下;
public class SingleDemo {private static SingleDemo s = null;private SingleDemo(){}public static SingleDemo getInstance(){/*如果第一个线程获取到了单例的实例对象, * 后面的线程再获取实例的时候不需要进入同步代码块中了*/if(s == null){//同步代码块用的锁是单例的字节码文件对象,且只能用这个锁synchronized(SingleDemo.class){if(s == null){s = new SingleDemo();}}}return s;}}
用这种方式解决了懒汉式的线程安全问题,也提高了效率,但是在实际开发中还是用饿汉式的比较多,毕竟这个代码比较多,比较繁琐。
- 解决单例设计模式中懒汉式线程安全问题
- 解决单例设计模式中懒汉式线程安全问题
- 解决单例设计模式中的懒汉设计模式存在线程安全问题(并且在一定程度上提高效率)的一种解决方法
- 简单java单例模式 懒汉式、饿汉式以及解决线程安全问题(synchronized)
- Java 多线程学习笔记(十一) 单例设计模式(延迟加载/懒汉模式)DCL解决线程安全问题
- 处理单例设计模式中懒汉式的安全问题过程
- 单例设计模式中懒汉式并发访问的安全问题
- Java——单例设计模式中懒汉式并发访问的安全问题
- 单例设计模式:饿汉式、懒汉式、枚举方式。以及涉及到的线程安全问题和反射机制问题。
- 单例设计模式中懒汉式和饿汉式
- C++中的单例模式(懒汉模式、饿汉模式及线程安全问题)
- 单例设计模式II (懒汉式)
- 单例设计模式 饿汉式 懒汉式
- 单例设计模式(懒汉式)
- 单例设计模式-饿汉式-懒汉式
- (多线程-单例设计模式-懒汉式)
- 单例设计模式二---懒汉式
- 单例设计模式之懒汉式
- 选择排序——快速排序
- 在windows7上安装apache2.4.3 [菜鸟教程]
- 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析
- OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]
- 线程高级应用-心得9-空中网的三道面试题,考察应试者的线程掌握的深度
- 解决单例设计模式中懒汉式线程安全问题
- Linux 数独小游戏 curses cs50 作业
- delphi 数组定义
- POJ 2339 Rock, Scissors, Paper
- JDBC连接ORACLE
- Template extends xiaodao @version1.0
- ZOJ 1243 URLs
- [机器学习]基于OpenCV实现最简单的数字识别
- ZOJ 1402 Magnificent Meatballs