inflearn logo
강의

講義

知識共有

キム・ヨンハンの実戦Java - 高級編1、マルチスレッドと並行性

CASロック 実装1

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

解決済みの質問

268

leeshan1239528

投稿した質問数 5

1

질문.png

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

java 객체지향 동시성 multithread thread

回答 2

2

BeakGwa

현재 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을 사용하게 되서 문제가 발생하게 된거죠.

0

leeshan1239528

정말 감사합니다!! ㅎㅎ

1

BeakGwa

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

volatile lock , synchronized lock

 

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

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

 

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

 

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

0

leeshan1239528

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

모니터와 synchronized, ReentrantLock, 원자적연산 CAS관련해서 추가적으로 더 깊게 공부했는데 제가 이해한 것이 맞나요??

0

85

1

Future cancel기능을 사용했지만 interrupt가 발생하지 않을 때 어떻게 처리해야하나요?

0

73

2

2.스레드 생성과 실행 - 17P 그림 문의

0

74

2

자바 동시성 현업에서 사용예시가 궁금합니다

0

136

1

ReentrantLock 동작 원리에 대한 질문입니다.

0

83

1

synchronized 대신 join 을 사용하여 순서를 보장할 경우 해법이 아닌가요?

0

94

2

메모리 가시성 문제 질문

0

72

1

Future4-이유 질문

0

64

1

오타 제보

0

76

2

runnable 질문

0

95

2

자바가 아닌 다른 언어에서도

0

111

1

메모리 가시성 문제가 발생하는 이유

0

125

1

데몬스레드가 어떨 때 사용이 되는지 궁금합니다.

0

78

1

Future.cancel() 취소를 사용하는 예가 궁금합니다.

0

84

1

synchronized 와 인스턴스의 lock

0

91

2

synchronized 키워드만으로 메모리 가시성이 해결되는 이유가 궁급합니다.

0

63

1

[스레드 풀과 Executor 프레임워크1][문제와 풀이] `log("일부 작업이 실패했습니다.");` 실행되는 경우가 있을까요?

0

59

1

원자적 연산이 멀티스레드 상황에서 안전한 이유를 제대로 이해했는지 확인 부탁드립니다

0

67

2

자바 고급 1,2,3편 같이 진행해도 문제없나요

0

77

2

CPU 캐시 때문에도 잔액이 200원이 될 수 있나요?

0

105

2

synchronized 메서드와 join 관련 질문이 있습니다.

0

69

2

섹션 14. 115번 강의 내용 질문

0

83

2

교안에 있는 7페이지 데이터 영역

0

51

1

Executor 스레드 풀 관리 질문

0

108

2