我认为你可以使用 java.util.concurrent.locks.ReentrantLock 来实现。
示例略有不同。 ClientA 让所有进入,ClientB 没有:
private final ReentrantLock lock = new ReentrantLock();
private void method(boolean exclusive){
log.debug("Before lock() ");
try {
lock.lock();
if (!exclusive) {
lock.unlock();
}
log.debug("Locked part");
//Method tasks....
Thread.sleep(1000);
}catch(Exception e){
log.error("",e);
}finally {
if(exclusive)
lock.unlock();
}
log.debug("End ");
}
执行:
new Thread("no-exclusive1"){
@Override
public void run() {
method(false);
}
}.start();
new Thread("exclusive1"){
@Override
public void run() {
method(true);
}
}.start();
new Thread("exclusive2"){
@Override
public void run() {
method(true);
}
}.start();
new Thread("no-exclusive2"){
@Override
public void run() {
method(false);
}
}.start();
结果:
01:34:32,566 DEBUG (no-exclusive1) Before lock()
01:34:32,566 DEBUG (no-exclusive1) Locked part
01:34:32,566 DEBUG (exclusive1) Before lock()
01:34:32,566 DEBUG (exclusive1) Locked part
01:34:32,567 DEBUG (exclusive2) Before lock()
01:34:32,567 DEBUG (no-exclusive2) Before lock()
01:34:33,566 DEBUG (no-exclusive1) End
01:34:33,567 DEBUG (exclusive1) End
01:34:33,567 DEBUG (exclusive2) Locked part
01:34:34,567 DEBUG (exclusive2) End
01:34:34,567 DEBUG (no-exclusive2) Locked part
01:34:35,567 DEBUG (no-exclusive2) End