나는 이것을 달성하기 위해 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
[ReadWriteLock] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html)이 작업을 수행하지만 시간을 주어야합니다 오버 헤드가 보람 있는지 여부를 알아 내야합니다. – user2357112
답변 해 주셔서 감사합니다. 세마포어를 사용하는 다른 방법이 없다고 생각하십니까? –