解决多线程单例模式的线程不安全问题
2017-05-02 17:00
465 查看
DCL双检查锁机制
public class MyConfig { private volatile static MyConfig myConfig = null;//volatile 保证每个线程都是从主存中读取最新的数据 private MyConfig(){ } public static MyConfig getInstance(){ if(null != myConfig){ }else { //同步代码块 synchronized (MyConfig.class){ if(null == myConfig){ myConfig = new MyConfig(); } } } return myConfig; } }
静态内置类
public class MyConfig { private MyConfig(){} private static class MyConfigHandler{ private static MyConfig myConfig = new MyConfig(); } public static MyConfig getInstance(){ return MyConfigHandler.myConfig; } }
序列化和反序列化
public class MyConfig implements Serializable{ private volatile static MyConfig myConfig = null;//volatile 保证每个线程都是从主存中读取最新的数据 private MyConfig(){ } public static MyConfig getInstance(){ if(null != myConfig){ }else { //同步代码块 synchronized (MyConfig.class){ if(null == myConfig){ myConfig = new MyConfig(); } } } return myConfig; } //单例类需实现这个方法,readResolve方法应对单例对象被序列化时候 public Object readResolve(){ return getInstance(); } public static MyConfig getMyConfig(){ try { MyConfig myConfig = MyConfig.getInstance(); FileOutputStream fileOutputStream = new FileOutputStream(new File("myobject.txt")); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(myConfig); objectOutputStream.close(); fileOutputStream.close(); System.out.println(myConfig.hashCode()); }catch (Exception e){ e.printStackTrace(); } MyConfig myConfig = null; try { FileInputStream fileInputStream = new FileInputStream(new File("myobject.txt")); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); myConfig = (MyConfig) objectInputStream.readObject(); objectInputStream.close(); fileInputStream.close(); System.out.println(myConfig.hashCode()); }catch (Exception e){ e.printStackTrace(); } return myConfig; } }
静态代码块
public class MyConfig{ private static MyConfig myConfig = null; private MyConfig(){} static{ myConfig = new MyConfig(); } public static MyConfig getInstance(){ return myConfig; } }
枚举实现
public class MyConfig { public enum MyConfigEnum{ connectionFactofry; private MyConnection myConnection = null; private MyConfigEnum(){ myConnection = new MyConnection(); } public MyConnection getMyConnection(){ return myConnection; } } public static MyConnection getConnection(){ return MyConfigEnum.connectionFactofry.getMyConnection(); } } public class MyConnection { public MyConnection(){ } }
相关文章推荐
- 黑马程序员-(多线程)了解线程与如何解决线程同步到来的安全问题!(面试)
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- 设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题
- java 多线程(线程间通信-解决安全问题)
- 基础篇_线程 第5集 多线程的安全问题--解决之道同步函数
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- 学习进度表 +解决单利设计模式懒汉式在多线程的安全问题
- 基础篇_线程 第4集 多线程的安全问题--解决之道同步代码块
- 多线程学习2,买火车票,并解决同步安全的问题
- Java 学习笔记16:用ThreadLocal解决多线程安全问题
- 同步代码快:解决多线程安全问题
- JDK1.5 中解决多线程安全问题的方法
- 解决word提示安全模式打开问题
- Delphi中多线程用Synchronize实现VCL数据同步显示 解决在线程中操作控件出现问题
- 黑马程序员------多线程(No.1)(概述、线程的创建、安全问题、同步锁、同步函数)
- WinForm解决多线程操作控件问题 线程间操作无效: 从不是创建控件的线程访问它"
- Java笔记3 多线程<1>线程概述、多线程的创建、多线程的安全问题、静态同步函数的锁、死锁
- ACE的ACE_Logging_Strategy类中的一个多线程安全问题的发现及解决过程
- 解决无法在设置线程模式后对其加以更改问题:2147549446(0x80010106)
- 黑马程序员——java中关于同步函数(或同步代码块)解决多线程安全问题的加锁