Java에 Mutex가 있나요?
Java에 Mutex 객체가 있나요? 또는 작성 방법이 있나요?1 permit으로 초기화된 Semaphore 객체가 도움이 되지 않아 문의드립니다.이 경우를 생각해 봅시다.
try {
semaphore.acquire();
//do stuff
semaphore.release();
} catch (Exception e) {
semaphore.release();
}
첫 번째 수집 시 예외가 발생하면 캐치 블록의 릴리스가 허용치를 증가시키고 세마포어는 더 이상 이진 세마포어가 아닙니다.
올바른 길이 될까요?
try {
semaphore.acquire();
//do stuff
} catch (Exception e) {
//exception stuff
} finally {
semaphore.release();
}
위의 코드는 세마포가 바이너리임을 보증합니까?
내의 는 Java를 할 수 .synchronized
또한 예외가 발생했을 때 자동으로 잠금을 해제합니다.
Object someObject = ...;
synchronized (someObject) {
...
}
자세한 내용은 다음 URL을 참조하십시오: 고유 잠금 및 동기화
다음 페이지를 참조하십시오.http://www.oracle.com/technetwork/articles/javase/index-140767.html
당신이 찾고 있는 (내 생각에) 패턴이 조금 다릅니다.
try {
mutex.acquire();
try {
// do something
} finally {
mutex.release();
}
} catch(InterruptedException ie) {
// ...
}
용법에서는 '이렇게 부르면 안 돼요'라고만release()
후에acquire()
아무도 이것에 대해 명확하게 언급하지 않았지만, 이러한 패턴은 보통 세마포어에는 적합하지 않습니다.그 이유는 어떤 스레드에서도 세마포를 해제할 수 있지만 일반적으로 원래 잠긴 소유자 스레드만 잠금을 해제할 수 있기 때문입니다.이 사용 사례의 Java에서는 보통 다음과 같이 ReentrantLocks를 사용합니다.
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
private final Lock lock = new ReentrantLock(true);
일반적인 사용 패턴은 다음과 같습니다.
lock.lock();
try {
// do something
} catch (Exception e) {
// handle the exception
} finally {
lock.unlock();
}
Java 소스 코드의 예를 다음에 나타냅니다.이 예에서는, 이 패턴이 동작하고 있습니다.
재진입 잠금 기능은 공정성을 지원한다는 추가적인 이점이 있습니다.
비소유 릴리스 시멘틱이 필요한 경우에만 세마포를 사용하십시오.
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
private final Lock _mutex = new ReentrantLock(true);
_mutex.lock();
// your protected code here
_mutex.unlock();
다음을 사용해 보는 것이 좋을 것 같습니다.
Semaphore 초기화 중:
Semaphore semaphore = new Semaphore(1, true);
당신의 ★★★★★★★★★★★★★★★★★★★★★★★★★★에Runnable Implementation
try
{
semaphore.acquire(1);
// do stuff
}
catch (Exception e)
{
// Logging
}
finally
{
semaphore.release(1);
}
원래 투고에서의 실수는 try loop 내에서 acquire() 콜셋입니다.다음은 "이진" 세마포어(Mutex)를 사용하는 올바른 방법입니다.
semaphore.acquire();
try {
//do stuff
} catch (Exception e) {
//exception stuff
} finally {
semaphore.release();
}
각 객체의 잠금은 Mutex/Semaphore 설계와 거의 차이가 없습니다.예를 들어 이전 노드의 잠금을 해제하고 다음 노드를 캡처하여 링크된 노드를 통과하는 방법을 올바르게 구현할 수 없습니다.그러나 mutex를 사용하면 구현이 용이합니다.
Node p = getHead();
if (p == null || x == null) return false;
p.lock.acquire(); // Prime loop by acquiring first lock.
// If above acquire fails due to interrupt, the method will
// throw InterruptedException now, so there is no need for
// further cleanup.
for (;;) {
Node nextp = null;
boolean found;
try {
found = x.equals(p.item);
if (!found) {
nextp = p.next;
if (nextp != null) {
try { // Acquire next lock
// while still holding current
nextp.lock.acquire();
}
catch (InterruptedException ie) {
throw ie; // Note that finally clause will
// execute before the throw
}
}
}
}finally { // release old lock regardless of outcome
p.lock.release();
}
이 클래스는 .java.util.concurrent
단, Mutext 실장은 Mutex.java에 있습니다.표준 라이브러리의 경우, Semaphore는 이 모든 기능 등을 제공합니다.
다음 사항을 확실하게 하기 위해Semaphore
는 바이너리입니다.세마포어를 작성할 때 허가 수를 1로 전달하기만 하면 됩니다.Javadocs는 조금 더 많은 설명을 가지고 있다.
언급URL : https://stackoverflow.com/questions/5291041/is-there-a-mutex-in-java
'programing' 카테고리의 다른 글
쿼리 문자열 매개 변수의 Java URL 인코딩 (0) | 2022.09.22 |
---|---|
왜 일부 리터럴의 경우 반환이 거짓입니까? (0) | 2022.09.18 |
시스템에 설치되어 있는 TensorFlow 버전을 확인하려면 어떻게 해야 합니까? (0) | 2022.09.18 |
요청 및 응답을 모의하려면 어떻게 해야 합니까? (0) | 2022.09.18 |
HTML5 localStorage에 개체를 저장하는 방법 (0) | 2022.09.18 |