对标题的措辞感到抱歉,没有解释清楚。如果有人可以编辑它会很好:)
我有四种方法,访问共享状态。目前它们不是线程安全的。 共享状态是一个列表。其中两个方法修改了列表,两个方法迭代它。可以简单地同步所有方法,但这会导致性能降低 - 只要没有正在运行的修改方法,迭代方法在多个线程中同时运行是完全安全的。
一种锁定方法,允许多个读者运行,或者需要单个编写器。
private List<T> list;
public void insert(T t) {// Write shared state
list.add(t);
}
public void remove(T t) {// Write shared state
list.remove(t);
}
public void doStuff(T t) {// Read shared state
// iterate list and do stuff
}
public void doOtherStuff() {// Read shared state
// iterate list and do stuff
}
答案 0 :(得分:2)
您可以使用Java的synchronized
关键字执行此操作。该关键字会在某个对象上创建一个锁,因此除非锁是打开的,否则您无法运行某些东西(在运行它时,它会调用锁)。在这种情况下,您需要两个锁,并且您必须锁定某个对象,因此您可以创建两个Object
并锁定它们。你需要的是:
A / B:
synchronized(lock1)
{
synchronized(lock2)
{
//do stuff
}
}
C:
synchronized(lock1)
{
//do stuff
}
d
synchronized(lock2)
{
//do stuff
}
c和d分别锁定lock1和lock2,它们不会相互冲突,因此可以并发运行。但是,a和b要求两个锁都可以自由运行,因此不能与任何其他方法同时使用。
答案 1 :(得分:2)
可能ReadWriteLock符合您的需求。线程a
和b
应获取write
锁,而线程c
和d
应获取读取