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

Java 如何允许多个方法同时运行,而某些其他方法不运行?,java,concurrency,Java,Concurrency,对标题的措辞感到抱歉,我没有解释清楚。如果有人可以编辑它,那就太好了:) 我有四种方法,访问共享状态。目前它们不是线程安全的。 共享状态是一个列表。其中两个方法修改列表,两个方法迭代列表。可以简单地同步所有方法,但这会降低性能——迭代方法在多个线程中同时运行是完全安全的,只要没有修改方法在运行 一种锁定方法,允许多个读卡器运行,或者需要一个写卡器 private List<T> list; public void insert(T t) {// Write shared state

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

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

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

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
}
私有列表;
公共void insert(T){//写入共享状态
列表。添加(t);
}
public void remove(T){//写入共享状态
列表。删除(t);
}
公共void doStuff(T){//读取共享状态
//迭代列表并做一些事情
}
public void doOtherStuff(){//读取共享状态
//迭代列表并做一些事情
}

您可以使用Java的
synchronized
关键字来实现这一点。关键字会在某个对象上创建一个锁,因此除非该锁打开(并且在运行时,它会调用锁),否则无法运行某个对象。在这种情况下,您需要两个锁,并且您必须锁定某个对象,因此您可以创建两个
对象
并锁定它们。您需要的是:

a/b:

c:

d:


c和d分别锁定在lock1和lock2上,它们彼此不冲突,因此可以并发运行。但是,a和b都需要释放两个锁才能运行,因此不能与任何其他方法并发。

可能符合您的需要。线程
a
b
应该获得
write
锁,而线程
c
d
应该获得read one

这会阻止d/c与自身同时运行。不一定。如果创建一个新类,c和d将与其他实例中的c和d并行运行,这很好。我应该更清楚地说明这些要求。c和d需要在类的一个实例中并发运行。那么问题就有点棘手了。我现在无法回答,但我会在稍后提出一个解决方案。线程在这里使用,我希望更改设计以使其不必要,但我不能,因为我正在修补其他人的代码以使其并发,并且需要使其尽可能类似于原始设计。更多细节可能会有所帮助。为什么某些方法可以同时运行而某些方法不能?是因为他们访问的共享资源还是共享状态?共享状态-一个数组列表,a和b修改它,而c和d只进行迭代。据我所知,这正是我所需要的!感谢3年后的更新:库ReadWriteLock不支持双向重入。我最终创造了。
synchronized(lock1)
{
    synchronized(lock2)
    {
        //do stuff
    }
}
synchronized(lock1)
{
    //do stuff
}
synchronized(lock2)
{
    //do stuff
}