当前位置: 首页 > 面试题库 >

静态方法和线程安全中的局部变量

和丰羽
2023-03-14
问题内容

我有一个关于可变范围的问题。

例如:

class A {
    private static void test() {
        // do something with local variables
    }
}

现在,我创建两个线程,并A为每个线程创建一个实例。

  1. 当我test()在每个线程中调用时,可以保证test()线程安全吗?

  2. 本地变量test()存储在哪里?每个线程的堆栈?堆空间?

PS我知道在这种情况下,静态是毫无意义的。我在我们的旧代码中找到了它;我只是想确定我所知道的!


问题答案:

局部变量存储在每个线程自己的堆栈中。这意味着局部变量永远不会在线程之间共享。这也意味着所有本地原始变量都是线程安全的。

对对象的本地引用有些不同。引用本身未共享。但是,引用的对象没有存储在每个线程的本地堆栈中。所有对象都存储在共享堆中。如果本地创建的对象从不转义其创建方法,则该线程安全。实际上,您也可以将其传递给其他方法和对象,只要这些方法或对象都没有使传递的对象可用于其他线程。

对象成员与对象一起存储在堆中。因此,如果两个线程在同一对象实例上调用一个方法,并且此方法更新对象成员,则该方法不是线程安全的。

线程安全检查:如果在同一线程的控制范围内创建,使用和配置了资源,并且从未逃避该线程的控制,则使用该资源是线程安全的。

来自:http :
//tutorials.jenkov.com/java-concurrency/thread-
safety.html



 类似资料:
  • 我的问题与静态变量的线程安全有关。 如果两个线程,t1具有静态锁,t2具有对象锁,可以同时继续,那么A类的状态测试将如何是线程安全的呢? 可能是,我错过了一些非常基本的东西,但不确定它是如何工作的。 根据下面的答案,我得到的印象是,如果必须使这些状态成为线程安全的,那么两个锁都应该由正在更新此状态的线程持有,或者确保它被仅静态方法或仅非静态方法访问。对吧?

  • 问题内容: 通常,同时调用使用局部变量的实例方法是否仅与线程安全有关? 这是一个简短的例子。将调用多个线程;。 问题答案: 调用方法时,局部变量驻留在单个 调用的堆栈中,因此在多 线程的情况下也不必担心局部变量,但是如果File将其作为 参数传递,则可能会产生问题。 创建线程时,它将创建自己的堆栈。两个线程 将具有两个堆栈,并且一个线程永远不会与其他 线程共享其堆栈。 局部变量始终是线程安全的。但

  • 问题内容: 假设我有一些Java代码: 如果一个线程正在初始化SomeClass的对象,并且在第二个线程想要再次加载SomeClass的过程中正在初始化静态块中的值,那么该静态块会怎样?即使第一个线程未完成,第二个线程是否仍假设它已初始化而忽略了它?还是发生其他事情? 问题答案: 如果第一个线程尚未完成对SomeClass的初始化,则第二个线程将阻塞。 Java语言规范的12.4.2节中对此进行了

  • 问题内容: 是否可以在Go中定义一个局部变量,该局部变量可以从一个函数调用到另一个函数保持其值?在C语言中,我们可以使用保留字。 在C中的示例: 问题答案: 使用闭包: 函数文字是闭包:它们可以引用周围函数中定义的变量。然后,这些变量在周围的函数和函数文字之间共享,并且只要可以访问它们就可以保留。 它不必在全局范围内,只需在函数定义之外即可。 (去操场上的样本)

  • 问题内容: 我已经阅读了很多,但是还没有找到确切的答案。 我有一堂课,看起来像这样: 而且我想知道从Foo实例访问sharedData是否是线程安全的(如构造函数和doSomethingUseful()中所示)。Foo的许多实例将在多线程环境中创建。 我的意图是在静态初始化程序中初始化sharedData,此后不进行修改(只读)。 我读到的是,不可变对象本质上是线程安全的。但是我仅在实例变量的上下