Java 在单例类中并发调用方法

Java 在单例类中并发调用方法,java,concurrency,singleton,Java,Concurrency,Singleton,假设我创建了一个名为Calculator的单例类,它带有一个add方法,该方法包含2个参数 public class Calculator { private static Calculator instance = new Calculator(); public static Calculator getInstance() { return instance; } public int add(int num1, int num2) {

假设我创建了一个名为Calculator的单例类,它带有一个add方法,该方法包含2个参数

public class Calculator {
    private static Calculator instance = new Calculator();

    public static Calculator getInstance() {
        return instance;
    }

    public int add(int num1, int num2) {
        return num1 + num2;
    }
}
案例1: 既然它是单例的,那么如果我们同时调用方法
add
比如10000次,会有什么问题吗

案例2: 如果这个类不是单例类,并且是一个普通类,那么如果我同时调用它,会发生什么呢

案例3: 现在,如果我的类不是单例,如果我的add方法是静态方法,那么内存将如何使用

所以我的疑问是它的行为,给定场景中的Java内存模型是什么。哪个是有效的还是推荐的?你能帮我理解这一点吗

案例1:既然是单身,如果我们打电话会有什么问题吗 方法加并说一万次

这里没有并发问题:方法
add
没有任何副作用(它不会更改对象的状态)

案例2:如果这个类不是单例的,那么它是一个普通的类,又是什么呢 如果我同时做同样的事情就会发生

和前一个答案一样

案例3:如果我的类不是singleton,如果我的add方法是 静态方法那么内存将如何使用

答案与前两个相同:不管方法是否是静态的,每次使用这两个参数调用它时,它都会对这些参数执行计算,而不会更改实例/类的状态

所以我的疑问是它是如何工作的,Java中的内存模型是什么 给定场景。哪个是有效的还是推荐的?你能帮我吗 帮我理解这个

再说一次,这没关系。不会出现并发问题,因为没有修改任何状态。这与并发性或JMM无关

案例1:既然是单身,如果我们打电话会有什么问题吗 方法加并说一万次

这里没有并发问题:方法
add
没有任何副作用(它不会更改对象的状态)

案例2:如果这个类不是单例的,那么它是一个普通的类,又是什么呢 如果我同时做同样的事情就会发生

和前一个答案一样

案例3:如果我的类不是singleton,如果我的add方法是 静态方法那么内存将如何使用

答案与前两个相同:不管方法是否是静态的,每次使用这两个参数调用它时,它都会对这些参数执行计算,而不会更改实例/类的状态

所以我的疑问是它是如何工作的,Java中的内存模型是什么 给定场景。哪个是有效的还是推荐的?你能帮我吗 帮我理解这个


再说一次,这没关系。不会出现并发问题,因为没有修改任何状态。这与并发性或JMM无关。

如果同时调用该方法,则没有问题。就你的情况而言,没有问题不会出现并发问题,因为没有修改任何状态。因此,不会有任何影响


如果要在多线程环境中访问它,则需要将其设置为
同步
,以确保线程安全。

如果同时调用该方法,则没有问题。就你的情况而言,没有问题不会出现并发问题,因为没有修改任何状态。因此,不会有任何影响


如果您想在多线程环境中访问它,那么您需要将其设置为
同步
,以确保线程安全。

您提供的
添加
包含两个基本变量,并且您的方法只处理它们,没有字段或任何其他在多个实例之间共享的内容。除非对这些原语有详细的使用,否则这里的单例和并发性都很重要。1)没有问题,2)没有区别,3)仍然没有问题。没有需要担心的并发性或性能问题。您必须想知道这是否是您可能拥有的最简单的代码,并且在实际执行此操作时是否存在可维护性开销,或者使用此方法是否会让人不必要地感到困惑。您提供了两个基本变量
add
,而您的方法只处理它们,没有在多个实例之间共享的字段或任何其他内容。除非对这些原语有详细的使用,否则这里的单例和并发性都很重要。1)没有问题,2)没有区别,3)仍然没有问题。没有需要担心的并发性或性能问题。您必须想知道这是否是您可能拥有的最简单的代码,并且在实际执行此操作时是否存在可维护性开销,或者使用这样一种方法是否会让人不必要地困惑。你能解释一下为什么我需要用清晰的解释来同步这个方法吗?我说你不需要同步,因为如果你为了线程安全的目的在多线程环境中调用它,你能解释一下吗?在多线程环境中它是如何影响的,我这里没有实例变量。如果两个或多个线程同时访问同一个对象,它可能会影响对象状态。如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,则该代码是线程安全的。线程安全不一定意味着您必须使用
synchronized
关键字。请您解释为什么我需要同步此方法,并给出明确的解释?您需要我不需要同步,因为如果您在多线程环境中调用它是为了线程安全,您能解释一下吗?它对多线程环境有何影响,我这里没有实例变量