当前位置: 首页 > 知识库问答 >
问题:

Java单例与同步

郎河
2023-03-14
  • 在多线程环境中用Java实现单例的最佳方法是什么?
  • 当多个线程同时尝试访问getinstance()方法时会发生什么?
  • 我们可以让Singleton的getinstance()同步化吗?
  • 当使用单例类时,真的需要同步吗?

共有1个答案

班经亘
2023-03-14

是的,这是必要的。您可以使用以下几种方法通过惰性初始化实现线程安全:

严格的同步:

private static YourObject instance;

public static synchronized YourObject getInstance() {
    if (instance == null) {
        instance = new YourObject();
    }
    return instance;
}

这个解决方案要求每个线程都要同步,而实际上只需要前几个线程同步。

private static final Object lock = new Object();
private static volatile YourObject instance;

public static YourObject getInstance() {
    YourObject r = instance;
    if (r == null) {
        synchronized (lock) {    // While we were waiting for the lock, another 
            r = instance;        // thread may have instantiated the object.
            if (r == null) {  
                r = new YourObject();
                instance = r;
            }
        }
    }
    return r;
}
private static class InstanceHolder {
    private static final YourObject instance = new YourObject();
}

public static YourObject getInstance() {
    return InstanceHolder.instance;
}
 类似资料:
  • synchronize关键字是否需要应用于实现如下单例模式的类的每个方法? 由于Singleton不公开公共构造函数,并且getInstance()方法是同步的,因此不需要同步方法DoA和Singleton类公开的任何其他公共方法。 这个推理正确吗?

  • 问题内容: 用Java编写单例的经典过程是这样的: 并且如果需要在多线程情况下运行,可以添加synced关键字。 但是我更喜欢这样写: 我认为这更简洁,但是奇怪的是我没有看到以这种方式编写的任何示例代码,如果以这种方式编写代码,会不会有不好的效果? 问题答案: 您的代码与“示例代码”之间的区别在于,加载类时将实例化您的单例,而在“示例”版本中,直到实际需要时才实例化它。

  • 本文向大家介绍实例详解java Struts2的配置与简单案例,包括了实例详解java Struts2的配置与简单案例的使用技巧和注意事项,需要的朋友参考一下 Struts2的配置与简单案例: 1. 创建一个dynamic web project(创建时让它自动生成web.xml文件) 2.引入相关jar包 3.在web.xml中进行配置 (启动tomcat服务器之后第一个加载的文件就是web.x

  • 问题内容: 因此,我正在考虑建立一个业余项目,这只是为了完成我的编程/设计。 它基本上是一个多线程的网络蜘蛛,更新了相同的数据结构object-> int。 因此,为此使用数据库绝对是矫kill过正,而我唯一想到的就是用于包含我的数据结构的线程安全单例。http://web.archive.org/web/20121106190537/http://www.ibm.com/developerwor

  • 问题内容: 我有小问题。我学习Java SE并找到ClassLoader类。我尝试在下面的代码中使用它:我试图使用URLClassLoader在运行时动态加载类。 Java虚拟机看不到我的类,并且出现以下异常: 你知道我能解决这个问题吗? 问题答案: 因此,您尝试动态加载类,然后静态引用它。如果您已经可以静态链接到它,则说明已加载并且无法再次加载。您需要通过反射访问方法。 您通常要做的是让加载的类

  • 如果我为各种品牌的汽车建模,我会使用继承层次结构,还是仅仅改变构造函数参数? 关于是使用继承还是仅通过重复使用同一类来关联对象,一般的规则是什么? 对于汽车,我可以做一些像新车(“保时捷”、“991”、“3.8”)这样的事情,或者我可以有一个整体抽象的汽车超类,有像“保时捷”这样的抽象子类制造商,然后可能为保时捷的每个型号都有一个类?