我认为你可以使用java.util.concurrent.locks.ReentrantLock来实现。
例子有点不同。客户端A让所有的进入,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
A [ReadWriteLock](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html)可以完成这项工作,但您必须花费时间弄清楚这些开销是否值得。 – user2357112
感谢您的回答。你认为有没有不同的方式来使用信号量? –