본문 바로가기

카테고리 없음

쓰레드 세이프

쓰레드 세이프

  • 여러 쓰레드에서 공통된 데이터를 조회 및 수정했을 때, 데이터가 깨지지 않음
  • 중간상태없음
  • 메모리가 깨지지 않음
  • 경쟁상태에 있지 않은 것

 

예제

var counter = 0
fun add() {
    counter ++
}
  • add 함수가 여러쓰레드에서 동시에 불려졌을때 counter의 값이 깨질 수 있음
  • counter ++는 여러가지 명령어의 집합체
  • (추후 표 첨부)

 

주의 해야할 것

  • 쓰레드 세이프 하다고 개발자가 호출한 순서 그대로를 보장한다는게 아님
  • 쓰레드 세이프는 데이터의 원자성을 보장함
val uiState = MutableState<UiState>(UiState())

// 1번, delay는 연산이 오래걸리는 것을 명시적으로 처리 
uiState.update { delay(200) it.copy() } 

// 2번 
uiState.update { dealy(100) it.copy() }
  • 1번, 2번 호출을 했지만 최종 데이터 결과는 1번이다.