인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

재고시스템으로 알아보는 동시성이슈 해결방법

Redisson 을 활용하여 재고로직 작성하기

lock.tryLock(15, 1, TimeUnit.SECONDS) 질문입니다!

작성

·

92

·

수정됨

0

안녕하세요! 강의를 보면서 많은 도움 얻고있습니다.

항상 감사합니다!

 

궁금한점이 아래 시간에 해당하는 부분인데요.

boolean available = lock.tryLock(15, 1, TimeUnit.SECONDS);

강사님과 저의 테스트코드에선 thread를 100개를 만들어 놓고 테스트를 진행했습니다.

그리고 락을 한번 획득하면 1초동안 점유하고 있고, 락 획득을 위해 대기할 수 있는 시간은 총 15초 입니다.

그래서 락을 획득할 수 있는 스레드는 1초에 한개씩으로, 테스트코드가 성공하려면 총 100초가 걸려야 하고, 지금 상황으로는 성공하지 않아야 정상이라고 생각하는데 강사님의 코드에서 성공한 이유가 뭔지 궁금합니다!


제가 아직 이해를 제대로 못해서 뭔가를 놓친 것 같은데 감이 잘 안잡히네요 ㅠㅠ

답변 2

0

최상용님의 프로필 이미지
최상용
지식공유자

안녕하세요!
해당 코드는 1초동안 점유하고 있다고 했지만 1초 이전에 로직이 끝나면 락을 반환하게 됩니다.
그렇기때문에 성공할 수 있습니다!

0

안녕하세요, 인프런 AI 인턴입니다. Jay님의 질문과 관련하여, Redisson의 tryLock 메서드 사용과 관련된 waitTimeleaseTime 파라미터 설정에 대해 궁금증이 있으시군요.

설명드리자면, tryLock(long waitTime, long leaseTime, TimeUnit unit) 메서드는 주어진 waitTime 동안 락을 획득하기 위해 시도하고, 락을 성공적으로 획득하면 지정된 leaseTime 동안 락을 소유하게 됩니다. 만약 leaseTime이 지나면 자동으로 락이 해제되어 다른 스레드가 락을 획득할 수 있게 됩니다. 여기서 중요한 점은 전체 테스트 시간과 각 스레드가 락을 시도하는 시간, 그리고 락을 유지하는 시간이 상호 작용하여 최종적으로 테스트의 성공 여부를 결정한다는 것입니다.

Jay님께서 언급하신 상황은 어떤 스레드가 락을 획득하고 있을 때 다른 스레드들이 해당 락을 어떻게 대기하며 시도하는지에 대한 이해를 돕고자 하는 것 같습니다. 이와 관련하여 유사한 질문이 Redisson - 100개의 스레드가 동시에 tryLock을 호출하나요?에서 다뤄졌습니다. 질문자는 100개의 스레드가 동시에 재고 감소를 시도할 때, 모든 스레드가 tryLock으로 락 획득을 요청하는지, 그리고 왜 테스트가 성공하는지에 대해 문의했습니다.

이 답변에서 강사님은 tryLockwaitTime이 충분히 클 경우, 모든 스레드가 순서대로 락을 획득하여 작업을 수행한 후 락을 해제하게 되므로, 설정된 waitTimeleaseTime 내에서 모든 스레드가 자신의 작업을 수행할 수 있다는 것을 설명합니다. 여기서 핵심은 leaseTime 동안 작업을 완료하고 락을 해제함으로써 다음 스레드가 락을 획득할 수 있는 기회를 제공한다는 것입니다.

질문하신 상황이 이와 유사한 경우, 강사님이 설명한 내용이 Jay님의 궁금증을 해소하는 데 도움이 될 것 같습니다. 또한, 일반적인 동작 원리에 대한 이해를 바탕으로 테스트가 예상과 다르게 성공하는 이유를 파악해볼 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기