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

单例、线程安全和互斥

别宏盛
2023-03-14

我今天在思考这个问题。下面是我正在思考的一个场景。

public int addTwoNumbers(int a, int b) {
    int x = a;
    int y = b;
    int z = a + b;
    return z;
}

singletonClassObj。添加两个数字(10,20);

SingletonClassObj.addTwoNumbers(100,200);

现在我的问题是什么,假设Thread-1首先执行并调用方法。那么有没有可能在整个函数被线程-1执行之前,线程-2调用函数并更改x和y的值?例如,线程-1以10和20的形式发送数据,在将求和分配给变量z之前,线程-2将x和y的值更改为100和200,这反过来又使线程-1返回300而不是30。为了克服这个问题,我们需要加锁或互斥锁,但这可能吗(没有互斥锁)。

共有2个答案

裴令秋
2023-03-14

不,两个或多个线程永远不可能在一个方法中访问相同的局部变量

但是请注意,当变量是引用类型时(它们不在示例中,您只使用原语类型int),那么它们指向的对象可能会被不同的线程同时访问。

司马狐若
2023-03-14

addTwoNumbers:所有变量都是局部变量。当调用这个方法时,它们将被存储在堆栈中。因为每个方法都创建自己的堆栈。所以两个线程将有两个完全不同的堆栈。所以从多线程的角度来看,它们是安全的。您不需要任何锁或互斥锁。

如果您使用的是始终存储在堆内存区域中的任何对象(引用变量)。所以需要同步。

此外,当您更新单例对象的状态时,您可能需要同步。因为这是线程之间共享的。

 类似资料:
  • 我在多线程环境中做的工作很少。所以,我需要知道below类的getInstance函数是否是线程安全的。这是单例类: 在getInstance函数(未注释)中,返回静态对象的引用。它需要线程安全机制吗? 在第二个getInstance(注释)中,如果singleObject为null,我们就创建对象。所以,它需要锁定机制,需要同步,对吧?

  • 问题内容: 我写了下面的Singleton类。我不确定这是否是线程安全的单例类吗? 谁能帮我这个?我在上述Singleton课堂上的任何想法都会有很大帮助。 更新代码: 我正在尝试将波希米亚建议纳入我的代码中。这是更新的代码,我得到了- 谁能看一下,让我知道这次是否正确? 问题答案: 但是有一个简单的技巧,可以让你的代码是线程安全的实现,并不需要同步!它称为“ 按需初始化持有人”习惯用法,它看起来

  • 问题内容: 有关Singletons的维基百科文章提到了一些用线程安全的方法来用Java实现结构。对于我的问题,让我们考虑具有冗长的初始化过程并且一次被多个线程访问的Singleton。 首先,这个未提及的方法是线程安全的吗?如果是的话,它在什么上进行同步? 其次,为什么以下实现线程安全且在初始化时是懒惰的?如果两个线程同时进入该方法,到底会发生什么? 最后,在第二个示例中,如果一个线程首先获取一

  • 我想知道Spring单例豆是否是线程安全的,如果是,那么为什么,如果不是,那么为什么? 因为我是初学者,所以帮助将不胜感激。

  • 静态编程语言单例(更具体地说,对象声明)在结构上是线程安全的吗?如果不是,用静态编程语言编写线程安全单例的最佳实践是什么? 我想是的,但我在文件中找不到任何明确的声明。

  • 本文向大家介绍枚举单例 线程安全-Java版相关面试题,主要包含被问及枚举单例 线程安全-Java版时的应答技巧和注意事项,需要的朋友参考一下 用枚举写单例实在太简单了!这也是它最大的优点。下面这段代码就是声明枚举实例的通常做法。 我们可以通过EasySingleton.INSTANCE来访问实例,这比调用getInstance()方法简单多了。创建枚举默认就是线程安全的,所以不需要担心doubl