如何允许多个方法同时运行,而某些其他方法没有运行?

时间:2012-12-26 22:23:48

标签: java concurrency

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

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

一种锁定方法,允许多个读者运行,或者需要单个编写器。

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
}

2 个答案:

答案 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符合您的需求。线程ab应获取write锁,而线程cd应获取读取