当前位置: 首页 > 编程笔记 >

Java线程安全的Singleton具有双重检查的锁定

李兴安
2023-03-14
本文向大家介绍Java线程安全的Singleton具有双重检查的锁定,包括了Java线程安全的Singleton具有双重检查的锁定的使用技巧和注意事项,需要的朋友参考一下

示例

这种类型的Singleton是线程安全的,并且可以在创建Singleton实例之后防止不必要的锁定。

Java SE 5
public class MySingleton {

    // 类的实例
    private static volatile MySingleton instance = null;

    // 私有构造函数
    private MySingleton() {
        // 一些构造对象的代码
    }

    public static MySingleton getInstance() {
        MySingleton result = instance;
        
        //如果实例已经存在,则无需锁定
        if(result == null) {
            //单例实例不存在,请锁定并再次检查
            synchronized(MySingleton.class) {
                result = instance;
                if(result == null) {
                    instance = result = new MySingleton();
                }
            }
        }
        return result;
    }
}

必须强调的是-在Java SE 5之前的版本中,上述实现是错误的,应避免使用。在Java 5之前的Java中无法正确实现双重检查锁定。

 类似资料:
  • 本文向大家介绍双重检查加锁单例 线程安全-Java版相关面试题,主要包含被问及双重检查加锁单例 线程安全-Java版时的应答技巧和注意事项,需要的朋友参考一下 双重检验加锁模式(double checked locking pattern),是一种使用同步块加锁的方法。程序员称其为双重检查锁,因为会有两次检查 ,一次是在同步块外,一次是在同步块内。为什么在同步块内还要再检验一次?因为可能会有多个线

  • 问题内容: 我偶然遇到了一篇文章,该文章最近讨论了Java中的双重检查锁定模式及其陷阱,现在我想知道我多年来使用的那种模式的变体是否会遇到任何问题。 我看过许多关于该主题的文章和文章,并了解了对部分构造的对象的引用所带来的潜在问题,据我所知,我认为我的实现不受这些问题的影响。以下模式是否有问题? 而且,如果没有,人们为什么不使用它?在围绕此问题进行的任何讨论中,我从未见过推荐它的方法。 问题答案:

  • 问题内容: 我知道Java中的双重锁定已损坏,因此使Java中的Singletons线程安全的最佳方法是什么?我想到的第一件事是: 这样行吗?如果是这样,那是否是最好的方法(我想这取决于具体情况,因此说明何时使用特定技术是最好的方法) 问题答案: Josh Bloch建议使用单元素类型实现单例(请参阅 有效的Java 2nd Edition,第3项:使用私有构造函数或枚举类型强制单例属性 )。 有

  • 我正在修改一个Java服务器软件。整个应用程序是单线程的。我的一个更改需要很多时间,所以我决定异步执行,以避免冻结主线程。 问题是:这种锁在Java中的最佳实现是什么?例如,我是否应该使用亲自完成。 编辑:看看我当前实现的答案。

  • 当我的程序在一些迭代之间启动时,我会得到输出标志值,这意味着引用检查在同一引用上失败。但经过一些迭代后,输出变为常量值,然后长时间执行程序,不会生成一个输出。 如输出所示,经过n次(不固定)迭代后,输出似乎是一个常数值,不会改变。 输出: 对于某些迭代:

  • 我使用Java大约一个月了,在编程方面仍然是一个一般的业余爱好者,所以如果我有什么不对的地方,请随时纠正我。也许我会提供一些多余的细节,但我现在是如此困惑,我无法决定什么是重要的。 所以,我一直在开发多线程客户机-服务器应用程序。所有线程都在使用同一个对象,其中存储了某些配置值和共享记录器;此对象在server-thread中初始化,然后作为参数传递给client-thread类构造函数。首先,假