栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用双重锁定时使单例实例具有可变性有什么意义?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用双重锁定时使单例实例具有可变性有什么意义?

如果没有

volatile
代码,则无法在多个线程中正常工作。

从Wikipedia的双重检查锁定:

从J2SE
5.0开始,此问题已得到解决。现在,volatile关键字可确保多个线程正确处理单例实例。在“双重检查锁定已损坏”声明中描述了这一新用法:

// Works with acquire/release semantics for volatile// Broken under Java 1.4 and earlier semantics for volatileclass Foo {    private volatile Helper helper = null;    public Helper getHelper() {        Helper result = helper;        if (result == null) { synchronized(this) {     result = helper;     if (result == null) {         helper = result = new Helper();     } }        }        return result;    }    // other functions and members...}

通常,如果可能,应该避免仔细检查锁定,因为很难正确,如果错误,则很难找到错误。请尝试使用以下更简单的方法:

如果helper对象是静态的(每个类加载器一个),则替代方法是按需初始化持有人惯用语

// Correct lazy initialization in Java @ThreadSafeclass Foo {    private static class HelperHolder {       public static Helper helper = new Helper();    }    public static Helper getHelper() {        return HelperHolder.helper;    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469696.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号