-
2024.09.21 java-acquire-lock-by-keyTIL 2024. 9. 22. 12:15
ConcurrentHashSet 은 지원하지 않지만 ConcurrentHashMap.newKeySet를 지원한다.
내부적으로는 ConcurrentHashMap의 key를 관리한다.
https://www.baeldung.com/java-acquire-lock-by-key
단일 어플리케이션에서 사용할 수 있는 제어 방법이다.
key로 lock을 잡을 수 있는 방법이다. ReentrantLock을 사용했고, 이건 순서를 보장할 수 있다. FairSync냐 NonfairSync냐를 생성자로 정할 수 있다.
synchronized는 잠금대기를 jvm이 정해서 lock을 정해주는데 FairSync로 되면 기다린 순서로 lock을 준다.
코드를 보면 심플하게 잘 짜여 있다.
한 가지 걸리는 것은 unlock 하는 부분인데, 주석에도 쓰여 있듯이 동시성 문제가 발생할 수 있다.
addThreadInQueue를 다른 스레드에서 해버릴 경우 결국 unlock에서 get으로 조회한 lock wrapper의 값도 바뀌는 것인데 remove에 같은 객체를 던져버리면 의미가 있나? 하는 생각이다.
최악으로는 같은 key의 lock이 런타임에 2개 생길 수 있다.
음.
remove를 안해도 될 거 같긴한데 필요하다면 아래와 같이 할 수 있겠다.
추가로 ReentrantLock에는 try lock이라고 timeout을 줄 수 있다. 기능에 따라 timeout이 필요할 수 있다.
'TIL' 카테고리의 다른 글
2024.10.08 Duplicate Requests, Throttling Design Pattern (0) 2024.10.09 2024.10.05 NAT (0) 2024.10.05 2024.09.20 filter, interceptor, aop (0) 2024.09.20 2024.09.16 JDBC Internal - 타임아웃의 이해 (0) 2024.09.16 2024.09.13 hikaricp autoreconnect (0) 2024.09.14