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

이승환님의 프로필 이미지

작성한 질문수

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

CAS 락 구현1

unlock()에 synchronized를 걸면 왜 무한루프를 도는지가 이해가 안됩니다..ㅠㅠ

해결된 질문

24.08.22 04:05 작성

·

92

1

질문.png

synchronized를 unlock에 걸 필요가 없다는건 이해를 했는데 이것 저것 실험(?)을 해보다가 unlock()에 synchronized를 걸면 무한 대기 상태가 지속되는지 이해가 안됩니다..ㅠㅠ제가 계속 고민을 한 로직으로는 Thread-1이 비즈니스 로직을 실행한 후 finally를 실행해서 락을 반납해 Thread-2가 어느 정도 시간이 지난 후에 락을 받아서 실행이 될 것이라고 생각을 했는데 아니라서 많은 고민 끝에 질문을 남겨봅니다..ㅠㅠ 답변 기다리겠습니다..!

답변 2

2

BeakGwa님의 프로필 이미지

2024. 08. 22. 14:13

현재 SpinLockBad class의 lock(), unlock() 메서드는

해당 클래스의 private volatile boolean lock을 true 혹은 false로 변경시키면서 lock을 제어하고 있습니다.

 

하지만, synchronized를 사용하게 되면, 내부 락을 따로 사용하게 되는거죠. 여기서 synchronized를 통해 사용되는 lock 은 lock(), unlock() 메서드에 상관없이 메서드가 시작할때 내부 락을 획득 시도, 끝날때 내부 락을 반납 하게 됩니다.

 

결국, 해당 SpinLockBad 클래스는

  1. volatile boolean 타입 lock 하나

  2. synchronized 키워드를 통해 제어하는 내부 lock 하나

이렇게 두가지 lock을 사용하게 되서 문제가 발생하게 된거죠.

이승환님의 프로필 이미지
이승환
질문자

2024. 08. 22. 16:23

정말 감사합니다!! ㅎㅎ

1

BeakGwa님의 프로필 이미지

2024. 08. 22. 13:51

main코드가 있어야 확인이 가능할 것 같은데, 현재 확인된 코드로는 lock 전략이 두가지 설정되어있는 것 같습니다.

volatile lock , synchronized lock

 

synchronized 키워드를 사용해서 락 전략을 실현하면, 해당 클래스의 내부 lock을 사용하게됩니다.

locksynchronized키워드가 붙은 메서드 or 임계영역 이 완료될떄까지 lock을 반납하지 않습니다.

 

volatile lock으로 lock()/unlock() 메서드를 사용하여 락을 제어한다고 해도, synchronzed 의 내부 락은 반납하지 않기때문에, 질문에 있는 무한 대기 상태가 걸리는 것으로 예상됩니다.

 

공식 답변이 아니라서 틀릴수도 있는점 양해 부탁드립니다.

이승환님의 프로필 이미지
이승환
질문자

2024. 08. 22. 14:06

lock()과 unlock()이 각각 하나의 락을 가지고 있는게 아닌가요..? 어렵네요..ㅠㅠ 클래스가 같으니 같은 락을 가지고 있는거다 이런건가요..? 제가 이해한게 맞는지 잘모르곘네요..ㅠㅠ