《java 多线程编程核心技术》读书笔记二

来源:互联网 发布:ie11浏览器修复软件 编辑:程序博客网 时间:2024/06/05 11:44

多线程环境下的单例

饿汉模式:线程安全,在类加载的时候就初始化了,以空间换时间,占用内存

懒汉模式:非线程安全,在调用时初始化,以时间换空间,每次都需要消耗时间判断是否已初始化

懒汉模式在多线程的情况下会创建多个实例对象,其原因在于如下代码

if(obj==null){    //在实例化MyObject对象之前,如果其它线程已经执行了obj==null的判断,则会创建多个实例对象    obj = new MyObject();}

解决方法:

  • 同步方法 缺点:运行效率低
  • 同步代码块
    • 针对重要的代码进行单独的同步并使用DCL双检查锁机制
if(obj==null){    synchronized(MyObject.class){        if(obj==null){//如果去除此处的判断语句,则仍会创建多个实例对象            obj = new MyObject();        }    }}

其它可以解决多线程环境下单例模式非线程安全问题的办法:

  • 使用静态内部类实现单例模式 (后续需要了解加载顺序)
  • 涉及序列化和反序列化环境下需要借助readResolve()
  • 使用静态代码块实现单例
  • 使用枚举数据类型实现单例
阅读全文
1 0
原创粉丝点击