원자적 연산 (atomic operation)
단일해서 더 이상 잘게 쪼갤 수 없는 연산(operation)
어떤 연산의 결과가 외부의 간섭에 관계없이(명령이 실행되다가 중단되는 경우) 전체가 완료되든지 전혀 실행되지 않은 상태로만 나타남 (All or Nothing)
변수를 수정하는 일?
→ 각 단계 사이에 시간적 텀이 발생
→ 병렬 또는 동시적으로 실행될 때 공유되는 변수에 대해 변경사항이 덮어씌워질 수 있음
(동시성 오류)
→ 공유된 이 변수는 임계영역(critical section)
원자성 위반
스레드 한정(제한)
newSingleThreadContext()
)= 코루틴 + 채널
송신자(producer) - 수신자(consumer) 모델
수신자 구현: 특정 CoroutineContext로 실행 가능
val consumer = actor<T>(CoroutineContext) {
// implement for consumer
}
송신자 구현: 수신자와 다르게 코루틴에서 실행 가능
async(CommonPool) {
consumer.send() // call consumer as producer
}
actor를 스레드 한정(제한)과 같이 사용하면 좋음
CorutineContext
를 지정할 수 있으므로, newSingleThreadContext()
를 사용하면 스레드 한정 기법을 이용할 수 있음그 밖에 액터에 대한 추가 팁
capacity
매개변수를 빌더에 전달하여 구현 가능newSingleThreadContext()
를 전달했지만, newFixedThreadPoolContext()
등 자유롭게 지정 가능상호배제 (MUTual EXclusion):
synchronized
volatile 변수
아래 2가지 조건을 만족할 경우 사용 가능
공유 자원에 대해 한 스레드에서는 쓰기만 하고, 다른 스레드에서 읽기만 할 때 적합
2개 이상의 스레드가 동시에 공유 자원에 대한 읽기, 쓰기를 모두 할 경우 부적합
ex) a 변수를 1 스레드와 2 스레드가 모두 0으로 읽은 상태에서, 각각 +1을 경우 결국 메인 메모리에 저장되는 a 변수의 값은 1
성능 저하 이슈
atomic 데이터 타입