1

对不起,标题的措辞,没有解释清楚。如果有人可以编辑它会很好:)

我有四种方法,访问共享状态。目前它们不是线程安全的。共享状态是一个列表。其中两个方法修改列表,两个迭代它。可以简单地同步所有方法,但这会导致性能下降 - 只要没有修改方法正在运行,迭代方法在多个线程中同时运行是完全安全的。

需要一种允许多个读取器运行或单个写入器运行的锁定方法。

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
}
4

2 回答 2

2

可能ReadWriteLock符合您的需求。线程应该获取锁,而线程应该a获取读一bwritecd

于 2012-12-26T22:45:16.287 回答
1

您可以使用 Java 的synchronized关键字来执行此操作。关键字在某个对象上创建一个锁,因此除非锁打开(并且在运行它时,它会调用锁),否则您不能运行某些东西。在这种情况下,您需要两个锁,并且您必须锁定某个对象,因此您可以创建两个Objects 并锁定它们。你需要的是这样的:

甲/乙:

synchronized(lock1)
{
    synchronized(lock2)
    {
        //do stuff
    }
}

C:

synchronized(lock1)
{
    //do stuff
}

d:

synchronized(lock2)
{
    //do stuff
}

c 和 d 分别在 lock1 和 lock2 上加锁,互不冲突,因此可以并发运行。但是,a 和 b 要求两个锁都处于空闲状态才能运行,因此不能与任何其他方法并发。

于 2012-12-26T22:31:24.510 回答