【发布时间】:2016-03-22 20:48:47
【问题描述】:
因此,我需要为公司应用程序的一部分编写密集操作,使其远离 UI 线程(我们使用 Swing),并与一大堆高度线程不安全的组件进行交互.欢乐时光。
我正在尝试为自己简化这一点。所以事情是这样的:
1) 来自线程不安全组件的数据只会被读取,不会被写入。
2) 对该数据的引用将被传递给后台线程,如下所示:
final Object someData = getSomeData();
Runnable task = new Runnable() {
@Override
public void run() {
doSomething(someData);
}
};
此外,模式对话框会阻止用户在此过程中无意中更改任何值。所以 someData 的状态在整个过程中不会改变,只是被读取。
所以,我总是对内存一致性问题非常偏执。这里会有吗?通过以这种方式传递引用,后台线程是否会在此时获得它的最新状态?
谢谢。
【问题讨论】:
-
如果这就是您的意思,参考不会过时。每次使用它时,它都会反映当前状态。
-
我会先克隆 someData,然后再将其传递给线程。当线程完成对该数据的处理后,您可以将结果传递回 UI。
-
内部类与它没有任何关系。问题是第二个线程,它需要通常的线程安全预防措施:
synchronized或volatile。 -
我知道,但是正确同步这个对象几乎是不可能的。想象一下可以想象到的最糟糕的意大利面条代码。我可以确保在此过程中不会对 someData 进行任何写入,但如果我以上述方式将其传递给该后台线程,我是否能够正确读取其当前状态?
标签: java web-services rest ssl