반응형
동기화는 여러 개의 쓰레드가 하나의 자원(리소스)에 접근하려 할 때 주어진 순간에는 단 하나의 쓰레드만 접근 가능 하도록 하는 것이다.
둘 이상의 쓰레드가 공동의 자원(파일이나 메모리 블록)을 공유하는 경우, 순서를 잘 맞추어 다른 쓰레드가 자원을 사용하고 있는 동안 한 쓰레드가 절대 자원을 변경할 수 없도록 해야한다. 만약 한 쓰레드가 파일에서 레코드를 수정하는데, 다른 쓰레드가 동시에 같은 레코드를 수정하면 심각한 문제가 발생할 수 있기 때문입니다.
이런 상황을 처리할 수 있는 한 방법은 관련된 쓰레드에 대한 동기화를 하는 것이다.
동기화를 하는 방법 → synchronized함수를 만들어 사용 → synchronized블록 사용.
Thread-safe 하기 위한 일이다.
Synchronized 키워드
- Java 예약어
- 메소드 앞에 선언. (synchronized methodName)
Atomic 클래스
- 자바의 Atomic Type은 Wrapping 클래스의 일종으로 참조 타입과 원시타입 두 종류의 변수 모두 적용 가능하다. 사용시 내부적으로 CAS (Compare-And-Swap) 알고리즘을 사용해 lock없이 동기화 처리 할 수 있다.
- volatile과 synchronized와 달리 java.util.concurrent.atomic 패키지에 정의되어 있는 클래스이다.
- CAS는 특정 메모리 위치와 주어진 위치의 value를 비교하여 다르면 대체하지 않는다.
- 사용법은 변수를 선언할때 타입을 Atomic Type으로 선언한다.
AtomicLong atomicLong = new AtomicLong();
atomicLong.set(5L);
Volatile 키워드
- volatile keyword는 java변수를 Main Memory에 저장하겠다라는 것을 명시하는 것이다.
- 매번 변수의 값을 Read할 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는다.
- volatile 변수를 사용하고 있지 않는 MultiThread 애플리케이션은 작업을 수행하는 동안 성능 향상을 위해서 Main Memory에서 읽은 변수를 CPU Cache에 저장하게 된다
- 만약 Multi Thread환경에서 Thread가 변수 값을 읽어올 때 각각의 CPU Cache에 저장된 값이 다르기 때문에 변수 값 불일치 문제가 발생하게 된다.
- volatile는 변수의 read와 write 를 Main Memory 에서 진행하게 된다
- CPU Cache 보다 Main Memory가 비용이 더 크기 때문에 변수 값 일치를 보장해야 하는 경우에 volatile 을 사용하는 것이 좋다
public class SharedObject {
public volatile int counter = 0;
}
반응형
'Delvelopment > Kafka' 카테고리의 다른 글
[Kafka] 같은메시지를 반복적으로 소비했던 리밸런싱 이슈 해결 (MAX POLL RECORDS CONFIG = "max.poll.record (3) | 2020.11.30 |
---|---|
[Kafka] Topic 메세지 보관주기 설정 (MSK) (0) | 2020.10.12 |
[kafka Connect] 주기적으로 수행되는 무거운 쿼리 ALL_OBJECTS (table.poll.interval.ms) (3) | 2020.10.12 |
MQ (Message queue)란? (0) | 2020.08.21 |
[Spring Boot, kafka] 스프링 프로젝트에 kafka 리스너 적용기. (0) | 2020.06.29 |
댓글