해결된 질문
작성
·
129
1
synchronized를 unlock에 걸 필요가 없다는건 이해를 했는데 이것 저것 실험(?)을 해보다가 unlock()에 synchronized를 걸면 무한 대기 상태가 지속되는지 이해가 안됩니다..ㅠㅠ제가 계속 고민을 한 로직으로는 Thread-1이 비즈니스 로직을 실행한 후 finally를 실행해서 락을 반납해 Thread-2가 어느 정도 시간이 지난 후에 락을 받아서 실행이 될 것이라고 생각을 했는데 아니라서 많은 고민 끝에 질문을 남겨봅니다..ㅠㅠ 답변 기다리겠습니다..!
답변 2
2
현재 SpinLockBad
class의 lock(), unlock() 메서드는
해당 클래스의 private volatile boolean lock
을 true 혹은 false로 변경시키면서 lock을 제어하고 있습니다.
하지만, synchronized
를 사용하게 되면, 내부 락을 따로 사용하게 되는거죠. 여기서 synchronized
를 통해 사용되는 lock
은 lock(), unlock() 메서드에 상관없이 메서드가 시작할때 내부 락을 획득 시도, 끝날때 내부 락을 반납 하게 됩니다.
결국, 해당 SpinLockBad 클래스는
volatile boolean 타입 lock 하나
synchronized 키워드를 통해 제어하는 내부 lock 하나
이렇게 두가지 lock을 사용하게 되서 문제가 발생하게 된거죠.
1
main
코드가 있어야 확인이 가능할 것 같은데, 현재 확인된 코드로는 lock 전략이 두가지 설정되어있는 것 같습니다.
volatile lock
, synchronized lock
synchronized
키워드를 사용해서 락 전략을 실현하면, 해당 클래스의 내부 lock
을 사용하게됩니다.
이 lock
은 synchronized
키워드가 붙은 메서드
or 임계영역
이 완료될떄까지 lock
을 반납하지 않습니다.
volatile lock
으로 lock()/unlock() 메서드를 사용하여 락을 제어한다고 해도, synchronzed
의 내부 락은 반납하지 않기때문에, 질문에 있는 무한 대기 상태가 걸리는 것으로 예상됩니다.
공식 답변이 아니라서 틀릴수도 있는점 양해 부탁드립니다.
lock()과 unlock()이 각각 하나의 락을 가지고 있는게 아닌가요..? 어렵네요..ㅠㅠ 클래스가 같으니 같은 락을 가지고 있는거다 이런건가요..? 제가 이해한게 맞는지 잘모르곘네요..ㅠㅠ
정말 감사합니다!! ㅎㅎ