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

Java中静态变量的线程安全

乐钱青
2023-03-14

我的问题与静态变量的线程安全有关。

Class A{
private static int test=0;
public static void synchronized  m1(){
    test=test+1;
}
public void synchronized  m2(){
   test=test+1;
}

}

如果两个线程,t1具有静态锁,t2具有对象锁,可以同时继续,那么A类的状态测试将如何是线程安全的呢?

可能是,我错过了一些非常基本的东西,但不确定它是如何工作的。

根据下面的答案,我得到的印象是,如果必须使这些状态成为线程安全的,那么两个锁都应该由正在更新此状态的线程持有,或者确保它被仅静态方法或仅非静态方法访问。对吧?

共有2个答案

陶文林
2023-03-14

它不是线程安全的,您(问题作者)很好地解释了原因。

严朝明
2023-03-14

这不是线程安全的。这些方法使用不同的监视器对象:静态方法使用类,实例方法使用对象实例进行同步。您可以通过以下方法使实例方法将类用作监视器对象:

synchronized (A.class) {
...

如果你需要的话。不过,我会考虑让这两个方法都是静态的,除非您需要访问实例变量。

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

  • 问题内容: 类的静态成员是否在每个进程或线程中仅作为单个实例存在?意思是每个线程都具有自己的类的静态成员变量副本吗? 我的猜测是每个过程,对吗? 问题答案: 静态 字段 为每个类加载器提供一个值。 如果需要每个线程的值,请设置static 。

  • 问题内容: 在 多线程中 。我认为这是因为。这是唯一原因吗? 我知道。但为什么? 问题答案: 在多线程中,static没有意义。 恐怕你在做相反的陈述 。静态变量是一种共享资源,可用于在不同线程之间交换某些信息。而且,在访问这种共享资源时我们需要小心。因此,我们需要确保在多线程环境中对静态变量的访问是同步的。 每个线程都有自己的堆栈 这是正确的说法。堆栈仅保存局部变量,而不保存堆中的变量。静态变量

  • 如何从多个线程同时访问静态变量。 如果我有这样的课 我需要访问线程1的值,比如 从线程2中,我需要设置如下值 这会导致内存冲突吗?。如果是,建议使用什么方法来处理这种情况?。

  • 问题内容: 我有一个关于可变范围的问题。 例如: 现在,我创建两个线程,并为每个线程创建一个实例。 当我在每个线程中调用时,可以保证线程安全吗? 本地变量存储在哪里?每个线程的堆栈?堆空间? PS我知道在这种情况下,静态是毫无意义的。我在我们的旧代码中找到了它;我只是想确定我所知道的! 问题答案: 局部变量存储在每个线程自己的堆栈中。这意味着局部变量永远不会在线程之间共享。这也意味着所有本地原始变

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