질문 : 모니터가 이미 잠겨있을 때 동기화 된 블록을 다시 입력하는 비용은 얼마입니까? 예를 들어동기화 된 블록을 다시 입력하는 데 드는 비용
:
Object lock;
void outer()
{
synchronized (lock)
{
innerOne();
innerTwo();
}
}
void innerOne() { synchronized (lock) { /* ... */ } }
void innerTwo() { synchronized (lock) { /* ... */ } }
위의 의도는 스레드가 lock
에 동기화하는 동안 innerOne
및 innerTwo
항상 호출되는 것입니다.
무시할 수없는 비용이 있다면 assert
문을 넣기 위해 호출 할 수있는 방법이 있습니까? 가장 가까운 곳은 lock.notify()
으로 전화하여 IllegalMonitorStateException
을 잡는 것입니다.
boolean isMonitorHeld(final Object object)
{
try { object.notify(); return true }
catch (final IllegalMonitorStateException e) { return false; }
}
처럼 사용되는
:
void innerOne() { assert isMonitorHeld(lock); /* ... */ }
이 두 가지 옵션의 스타일에 대한 의견, 또는 어떤 대안이 있습니까?
편집
난 그냥보다 더 포괄적 인 답변의 시간을 볼 '바라고 있어요. 필자는 코드에 발생할 수있는 모든 잠재적 상황을 미리 예상 할 수있는 능력이 없으며 이러한 상황을 나타 내기위한 테스트를 작성하기도합니다. 동기화 메커니즘이 다른 상황에서 어떻게 수행되는지 이해하는 방법을 이해하고 싶습니다. 동기화가 다른 플랫폼에서 다르게 구현 될 수 있음을 이해합니다. 어떤 경우에는 (주로 Solaris와 Linux OS에서) 다릅니 까?
직관적으로, 필자는 동기식 블록을 다시 입력하는 것이 발견 할 수있는 대부분의 기사가 비경쟁 잠금 장치가 싸다는 것을 암시한다고 생각하지 않습니다. 그러나 동기화에서 처음 동기화 된 없이는 이라고 할 수있는 인상을 주므로 동기화 된 블록을이 메서드에 추가하는 것이 옳다고 생각하지 않습니다. 단언은 의도에 대한 더 나은 아이디어를 제공하지만 상당히 못생긴 해킹처럼 보입니다. 더 합법적 인 대안이 없다는 좋은 이유가 있는지 알고 싶습니다.
왜 측정하지 않습니까? 만약 당신이 * 차이를 측정 할 수 없다면 아무 것도 없다. – skaffman