私はあなたがそれを達成するために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
[ReadWriteLock](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html)は仕事をしますが、時間を取らなければなりませんオーバーヘッドが価値があるかどうかを判断する。 – user2357112
お返事ありがとうございます。セマフォーを使う方法がないと思いますか? –