java—在单例类中并发调用方法

ghhkc1vu  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(381)

假设我已经创建了一个名为calculator的单例类,它的add方法包含两个参数。

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 同时说一万次?
案例2:如果这个类不是单例的,并且是一个普通的类,那么如果我同时调用它,会发生什么呢。
案例3:如果我的类不是单例,如果我的add方法是静态方法,那么内存将如何使用?
所以我的疑问是它的行为,给定场景中的java内存模型是什么。哪个是有效的还是推荐的?你能帮我理解这个吗?

wydwbb8l

wydwbb8l1#

如果同时调用该方法,则没有问题。你的案子没有问题。不会有并发问题,因为没有修改任何状态。所以不会有什么影响。
如果您想在多线程环境中访问它,那么您需要将其设置为 synchronised 线程安全。

mtb9vblg

mtb9vblg2#

案例1:既然是单例,那么如果我们同时调用add方法,比如10000次,会有什么问题吗?
这里没有并发问题:方法 add 没有任何副作用(不会改变对象的状态)。
案例2:如果这个类不是单例的,并且是一个普通的类,那么如果我同时调用它,会发生什么呢。
和上一个答案一样。
案例3:如果我的类不是单例,如果我的add方法是静态方法,那么内存将如何使用?
与前两个答案相同:不管方法是静态的还是非静态的,每次使用这两个参数调用它时,它都会对这些参数执行计算,而不会更改示例/类的状态。
所以我的疑问是它的行为,给定场景中的java内存模型是什么。哪个是有效的还是推荐的?你能帮我理解这个吗?
再说一遍,没关系。不会有并发问题,因为没有修改任何状态。这与并发或jmm无关。

相关问题