gpt4 book ai didi

java - 非静态、私有(private)变量值在多线程运行中以某种方式共享/覆盖

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:58 24 4
gpt4 key购买 nike

看看你们能不能解决这个问题。这让我发疯。

我有一个类的 2 个实例,它们具有私有(private)实例 File 变量(不是静态的,不是 volatile 的)

private File tmpF;

然后每个实例在同一池中的不同线程中执行。

实例 1 和 2 都创建一个临时文件并将其分配给其 File 变量(非静态)。我打电话

tmpF = File.createTempFile("myTempFile" + unique_Id)

在创建临时文件之前,我使用 IntelliJ IDEA 进行了调试并验证每个线程都有不同的 unique_Id

这就是让我发疯的原因。当后面的线程创建临时文件并将其分配给自己的 tmpF 变量时,前面的线程 tmpF 变量的值更改为后面线程的 tmpF 值。当 tmpF 不是静态时,这怎么可能???

当我尝试将变量更改为本地方法变量时。问题消失了......所以这肯定与类字段有关。添加同步也不起作用。

最佳答案

这个问题听起来像是您在线程之间共享可变数据,在并发环境中应该避免这种情况,根据 Brian Goetz 的书 Java Concurrency in Practice 。根据您的限制,您有几种不同的选择。

  1. 如果您的类实例确实是单个线程的本地实例,请尝试重构您的字段,使其成为最终字段(即 private final File tmpF;),确保它只实例化一次。该文件可以从工厂类注入(inject)。
  2. 如果您的类有一个实例并且在线程之间共享,并且您确实需要让每个线程使用它自己的文件,请尝试使用 Java 的 ThreadLocal类。

希望有帮助。

关于java - 非静态、私有(private)变量值在多线程运行中以某种方式共享/覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36322231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com