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

Java多线程访问静态变量

仇正豪
2023-03-14

如何从多个线程同时访问静态变量。

如果我有这样的课

Class A {
    public static boolean FLG=false;
    .....................
    ....................
}

我需要访问线程1的值,比如

....................
public void run() {
    boolean t1=A.FLG;
    ..................
}

从线程2中,我需要设置如下值

....................
public void run() {
    A.FLG=true;
    ..................
}

这会导致内存冲突吗?。如果是,建议使用什么方法来处理这种情况?。

共有3个答案

锺离德庸
2023-03-14

您可能会遇到一些不希望出现的情况,即两个线程试图在静态变量中设置不同的值,而您无法确定实际值是什么。最好的方法(在一个简单的场景中思考)我认为是使用原子布尔(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html)然后你得到对象中的值并使用它(而不是一直使用对象,因为不同的线程可能会改变它,你可能会遇到意想不到的情况)。

另一个建议是使用Byteman创建并发测试

你好,栾

孟浩慨
2023-03-14

将静态变量包装在同步方法中并随心所欲地调用该方法

public static synchronized void method1(){
//Whatever
}

public static synchronized void method2(){
//Whatever again
}

请注意,还有其他方法可以同步对方法的访问。它们被认为在访问相同方法的繁忙线程的环境中更有效。

检查ReentrantLock类。还有关于何时使用synchronized和RentrantLock的答案,以及可以通过谷歌找到的更多信息。

正如彼得的回答和穆尔的评论所暗示的那样。将布尔变量标记为volatile应该会有所帮助volatile布尔变量不会缓存其初始值(falsetrue)。JVM偶尔会这样做,这可能是程序员意想不到的。

李言
2023-03-14

如果你想做的只是获取并设置一个原语,那么你可以将其设置为volatile,这样对于那些操作来说,它将是线程安全的。

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

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

  • 我有一个很大的json文件,其中包含一个很长的信息列表,我需要在许多子线程中只读该列表。 在java中,我们可以只通过值而不是引用来传递变量,我希望在内存/磁盘使用方面尽可能减少我的程序。 现在我将完整的列表或它的子列表传递给我创建的每个线程。 有没有一种方法可以从所有线程访问相同的列表变量,而不将完整的列表复制到每个线程中? 我需要“只读取”列表 下面是我的程序是如何工作的 1-服务(等待文件创

  • 我在比较C++多态性的以下方法的性能: 方法[1]。使用boost变体的静态多态性,每个方法都有一个单独的访问者method[2]。静态多态性使用boost变体,单个访问者调用不同的方法,使用方法重载方法[3]。平原老动态多态性 一些发现: 方法[1]似乎明显优于方法[2]和[3] 方法[3]在大多数情况下都优于方法[2] 我的问题是,为什么方法[2]在我使用一个访问者但使用方法重载来调用正确的方

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