我有一个静态方法,将由多个线程访问,如下所示。我想做的是,只要当前没有线程正在执行块2,就可以允许任意数量的线程执行块1,反之亦然。基本上,一个块的执行将锁定另一个块,而不是自身。 ReentrantReadWriteLock可以满足我的要求,因为我可以在块1周围放置一个读锁,在块2周围放置一个写锁,但是它仍然受到限制,因为我不能同时执行多个线程来执行块2。有什么建议?
public class SomeClass
{
...
public static void someMethod()
{
...
if(someCondition == true) //Begin block 1
{
doSomething();
} //End block 1
else if(someCondition == false) //Begin block 2
{
doSomething();
} //End block 2
...
}
...
}
最佳答案
听起来您需要创建自己的同步对象:它将具有以下方法:enterA(),leaveA(),enterB(),leaveB();它将具有互斥体,条件var和属性aCount和bCount。
enterA:
lock mutex
wait on condition var until bCount is zero
increment aCount
unlock mutex
leaveA:
lock mutex
decrement aCount
notify condition var if aCount==0
unlock mutex
enterB()和leaveB()将会相似,但是inc / dec bCount并等待aCount == 0。