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

Java以单例模式同步

楚墨一
2023-03-14

synchronize关键字是否需要应用于实现如下单例模式的类的每个方法?

public class Singleton {

  private Singleton(){}

  public synchronized static Singleton getInstance()
    {   
        if(instance == null)
            instance = new Singleton ();

        return instance;
    }

  public void DoA(){
  }
}

由于Singleton不公开公共构造函数,并且getInstance()方法是同步的,因此不需要同步方法DoA和Singleton类公开的任何其他公共方法。

这个推理正确吗?

共有3个答案

丌官嘉勋
2023-03-14

使用Singleton的正确(实际上是最好的)方法

private static singleton getInstance() {
    if (minstance == null) {
        synchronized (singleton.class) {
            if (minstance == null) {
                minstance = new singleton();
            }
        }
    }
    return minstance;
}
颛孙博易
2023-03-14

嗯,Singleton类的目的是它最多有一个实例,所有线程都可以访问同一个对象。

如果您不同步getInstance方法,可能会发生以下情况

Thread1输入getInstance()

Thread2进入getInstance()

Thread1将instance==null计算为true

Thread2计算实例==nulltrue

Thread1分配实例并返回

Thread2重新分配instance=new Singleton()并返回。

现在,两个线程都有一个不同的Singleton类实例,这是该模式应该阻止的。

同步可以防止两个线程同时访问同一代码块。因此,在多线程环境中实例化单例类时需要同步。

现在假设多个线程将尝试同时访问Singletons方法,那么在这些方法上同步可能也是必要的。尤其是当他们改变数据而不是只读取数据时,这是真的。

常坚
2023-03-14

和其他课程一样。它可能需要也可能不需要进一步同步。

考虑下面的例子:

public class Singleton {

  private Singleton() {}

  public synchronized static Singleton getInstance() { ... }

  private int counter = 0;

  public void addToCounter(int val) {
    counter += val;
  }
}

如果要从多个线程使用该类,addToCounter()具有竞争条件。解决这个问题的一种方法是使addToCounter()同步

  public synchronized void addToCounter(int val) {
    count += val;
  }

还有其他方法可以修复竞争条件,例如通过使用原子整数

  private final AtomicInteger counter = new AtomicInteger(0);

  public void addToCounter(int val) {
    counter.addAndGet(val);
  }

在这里,我们在不使用synchronized的情况下修复了竞争条件。

 类似资料:
  • 本文向大家介绍java  设计模式之单例模式,包括了java  设计模式之单例模式的使用技巧和注意事项,需要的朋友参考一下 java  设计模式之单例模式 前言: 在软件开发过程中常会有一些对象我们只需要一个,如:线程池(threadpool)、缓存(cache)、对话框、偏好设置等。这些对象如果制造出多个实例的话可能会导致一些不必要的麻烦,如:程序行为异常、资源使用过量等。这时单例模式就可以确保

  • 本文向大家介绍java设计模式之单例模式,包括了java设计模式之单例模式的使用技巧和注意事项,需要的朋友参考一下 单例模式也叫做单肩模式,也是一种创建型模式,是我们日常开发中最常使用的一种设计模式,经常被用来封装一些工具类,例如数据库连接等。 单例模式的定义: 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类

  • 本文向大家介绍Java单例模式、饥饿模式代码实例,包括了Java单例模式、饥饿模式代码实例的使用技巧和注意事项,需要的朋友参考一下

  • 问题内容: 就像我之前的问题一样,该问题引用了 Effective Java 。这次,我有很多子问题。 特权客户端可以借助该方法以反射方式调用私有构造函数。如果需要对此进行防御,请修改构造函数。 究竟如何调用私有构造函数?那是什么? 您的专家对单身人士采取什么方法? 如果我们每次都要检查新实例还是每次都检查同一个实例,第二种方法难道不是更灵活吗? 如果我尝试克隆类/对象怎么办? 单元素枚举类型是实

  • 主要内容:介绍,实现,SingleObject.java,SingletonPatternDemo.java,单例模式的几种实现方式,实例,实例,实例,实例,实例,实例单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只

  • 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppCon