Growth-Collectors / effective-java

repository for effective java study
3 stars 2 forks source link

아이템 78. 공유 중인 가변 데이터는 동기화해 사용하라 #80

Open HanaHww2 opened 1 year ago

YunDaHyee commented 1 year ago

아이템 78. 공유 중인 가변 데이터는 동기화해 사용하라


synchronized(동기화)의 기능

배타적 수행 - 해당 메서드나 블록을 한 번에 한 스레드씩 수행하도록 보장한다.

- 객체 접근 과정  
한 객체가 일관된 상태를 가진 채 생성됨(아이템 17)  
-> 이 객체에 접근하는 메서드는 그 객체에 락(lock)을 건다.  
-> 락을 건 메서드는 객체의 상태를 확인하고 필요하면 수정해서 객체를 하나의 일관된 상태에서 다른 일관된 상태로 변화시킨다.  
=> 동기화를 제대로 사용하면 이 객체의 상태가 늘 일관되는 것을 볼 수 있다.(일관성이 깨진 것을 볼 수 없음)

스레드 간의 통신 - 한 스레드가 만든 변화를 다른 스레드에서도 확인할 수 있게 해준다.

(동기화 없이는 한 스레드가 만든 변화를 다른 스레드에서 확인하지 못할 수 있다.)
동기화된 메서드나 블록에 들어간 스레드가 같은 락의 보호하에 수행된 모든 이전 수정의 최종 결과를 보게해준다.
=> 스레드 사이의 안정적인 통신에 꼭 필요하다.
(이유 - 자바의 메모리 모델에 한 스레드가 만든 변화가 다른 스레드에게 언제, 어떻게 보이는지가 규정되어있음 )

원자적 데이터와 동기화

  • long, double 외의 변수를 읽고 쓰는 것 - 원자적(atomic)
    여러 스레드가 같은 변수를 동기화 없이 수정하는 중이라도
    항상 어떤 스레드가 정상적으로 저장한 값을 온전히 읽어옴을 보장한다는 뜻

자바 언어 명세는 스레드가 필드를 읽을 때 항상 ‘수정이 완전히 반영된’ 값을 얻는다고 보장하지만
한 스레드가 저장한 값이 다른 스레드에게 ‘보이는가’는 보장하지 않는다.
성능을 위해서 원자적 데이터를 읽고 쓸 때는 동기화를 하지 않는 건 어리석다.
(이유 - 공유중인 가변 데이터를 비록 원자적으로 읽고 쓸 수 있을지라도 동기화에 실패하게 되면 리스크가 큼)0

예제

volatile 한정자 키워드

특징