非静态,私有变量值在多线程运行中以某种方式共享/覆盖

时间:2016-03-31 00:38:20

标签: java multithreading

看看你们是否可以解决这个问题。这让我疯了。

我有一个Class的2个实例,它有私有实例File个变量(非静态,非易失性)

private File tmpF;

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

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

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

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

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

当我尝试将变量更改为本地方法变量时。问题消失了...所以它肯定与类字段的事实有关。添加synchronized不是有趣的。

1 个答案:

答案 0 :(得分:0)

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

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