비동기 처리란?
어떤 작업을 실행하는 동안에 해당 처리가 끝나기를 기다리지 않고 다른 작업을 시작하는것을 말한다. 비동기 처리를 할 때 알아야하는게 스레드(thread) 이다.
여러개의 스레드로 작업을 처리하는것을 멀티스레딩 이라고 한다.
메모리와 캐시
비동기 처리 시 주의할 점의 하나는 클래스 필드가 가리키는 값과 실제 메모리가 가리키는 값이 동일하지 않을 수 있다는 점이다.
스레드별로 캐시값이 있고 특정 스레드에서 필드 값에 접근했을때 캐시값은 메모리 값과 다를 수도 있다.
캐시 값을 사용하는 이유는 주로 성능 향상을 위한 것인데, 필드 값이 바뀔때마다 실제 메모리에 매번 접근하는것보다는 캐시값에 접근해 처리하는것이 성능에 유리하기 때문이다.
원자성
비동기 처리시 일련의 처리 흐름 중간에 다른 작업이 끼어들 가능성이 있는지를 고려해야 하는데 일련의 처리가 분할할수 없게 돼 있는것을 원자성(atomicty) 이라고 한다.
비동기 처리시 발생하는 문제와 대응 방안
final 제한자와 불변 객체
가변 필드나 객체를 여러 스레드에서 다루는 것은 처리 도중에 다른 스레드의 처리 때문에 값이 변경돼 의도한 결과를 얻지 못할 위험성이 있다. 불변 객체는 모든 필드에 final 제한자를 붙여 생성자만으로 상태를 설정할 수 있게 해 객체의 상태 변경을 방지한다.
생성자를 private으로 선언한 뒤 static 정적 팩토리 메서드를 사용하여 객체를 생성할 수도 있다.
공유되는 가변 객체
가변 객체를 다룰 때는 메모리와 캐시, 원자성 두가지를 염두에 두어야 한다.
volatile 제한자
volatile 제한자는 필드 값으로 캐시 값이 아닌 메모리 값을 가져오게 보장하는 제한자이다.
java.util.concurrent.atomic 패키지
원자성이 있는 처리를 위해 자바 표준에서는 java.util.concurrent.atomic 패키지를 제공한다.
synchronized 블록
synchronized 블록을 처리하는 중에는 다른 스레드에서 해당 블록에 접근하는것을 막는다. 이처럼 다른 스레드의 접근을 막는 것을 베타 제어라고 한다. synchronized 블록에서 배타 제어를 실행하려면 처리의 소유권을 얻으려는 대상이 되는 객체가 필요한데 이를 락 객체(lock object) 라고하며, 이 객체의 락(lock)을 소유한 스레드만이 synchronized 블록에서 작업을 할 수 있다.
'Develop > java,spring' 카테고리의 다른 글
Intellij 단축키 (0) | 2020.11.12 |
---|---|
QueryDsl 설정부터 사용해보기 (0) | 2020.11.12 |
Junit5 가이드 (0) | 2020.11.05 |
application.properties 설정 목록 (0) | 2020.11.04 |
MSA(Micro Service architecture) (0) | 2020.11.04 |