【发布时间】:2018-07-10 14:32:45
【问题描述】:
我在一个应用程序中有 2 个单独的线程,用于进行一些图论模拟(使用 Java2D),一个线程每秒执行约 60 次,其任务正在渲染。另一个每秒执行约 30 次并进行一些计算。
这两个线程共享资源。具体来说,他们共享他们迭代的集合。当这两个线程同时访问一个集合时,就会出现问题。 (一个是尝试在其中渲染对象,另一个是修改集合)。这会导致 ConcurrentModificationException。我已经尝试了一些解决方案,我发现其中一个可以正常工作(并且易于实现)的解决方案是使用一个空对象,线程切换并保持锁定。
像这样(示例代码):
public class Question {
static Object syncObject;
public static void main(String []Args) {
syncObject = new Object();
Runnable rendering = new Runnable() { //called 60 times a second
public void run() {
synchronized(syncObject) {
//doRendering
}
}
};
Runnable calculations = new Runnable() { //called 30 times a second
public void run() {
synchronized(syncObject) {
//doModifications
}
}
};
Thread t1 = new Thread(rendering);
Thread t2 = new Thread(calculations);
t1.start();
t2.start();
}
}
现在,这似乎可以正常工作。这样我就不必同步我正在使用的每一个资源,这些资源可能在渲染时被修改以及“逻辑”计算更新。
但我觉得这不是一个很好的解决方案。所以我想问一下这是否可以接受和/或是否有更合适的解决方案。 (除非我做的是完全错误的)
另外,我不想重写我已经工作了一段时间的现有代码的一半。
【问题讨论】:
-
这是完全可以接受的,虽然我更喜欢这样的东西:
static final Object syncObject = new Object();以防止重新分配锁定对象。
标签: java multithreading synchronization