2014-04-24 1 views
1

ReentrantReadWriteLock에 대한 제한이 있습니까? 지금은 내 응용 프로그램을 테스트하고있어 내 쓰기 잠금이 더 이상 잠금을 제공하지 않는 것 같습니다 (true를 반환 : tryLock()).ReentrantReadWriteLock 제한

+1

* 쓰기 잠금 *은 일반적으로 최대 * 1 개의 소유 스레드를 지원합니다. 동시에 읽기 잠금이 없어야합니다. 읽기 잠금을 사용하는 스레드가 20 개일 때, 쓰기 잠금에서'tryLock'을 할 때 적어도 하나의 스레드가 읽기 잠금을 소유하고있을 가능성이 높습니다. – Holger

+0

@Holger 좋은 소리. 아마 그럴거야! – Martijn

답변

0

(true를 반환 : tryLock()) 내가 20 개의 스레드 일 때.

CPU가 20 개가 아니라면이 스레드는 동시에 모두 실행되지 않으며 실행중인 스레드는 그렇지 않은 스레드를 내쫓을 수 있습니다. 이것을 피하기 위해서는 공정한 자물쇠를 사용해야합니다.

더 나은 해결책은 모든 잠금 장치에서 중요한 경합이있는 코드를 작성하지 않는 것입니다.

+0

Fair Lock은 그가 'tryLock'일 때 도움이되지 않습니다. 블로킹'lock' 호출만이 스레드가 얼마나 오랫동안 기다리고 있는지 기억할 수 있습니다. – Holger

2

한계는 65535 개의 잠금이므로 20 개의 스레드로 치지는 않을 것 같습니다. 가능한 한 제한은 재진입 인수를 계산하지만,이를 위반하면 오류가 발생하고 잘못된 반환 값은 tryLock()이 아닙니다.

시스템이 바쁜만큼 tryLock()을 시도하면 정확한 순간에 잠금을 사용할 수 없습니다. 합리적인 시간 초과로 차단하는 호출로 전환하여 다른 스레드가 완료되고 잠금을 사용할 수있을 때까지 스레드가 대기 할 수 있도록해야합니다.

+0

이상한 부분입니다. 이전에 잠금 장치가 잠겨 있지 않습니다. 앱에서 처음입니다. – Martijn

+0

SCCE가 없다면 우리가 할 수있는 것은 추측입니다. – Affe

+0

SCCE? 나는이 문제에 대해 매우 익숙하다. – Martijn