본문 바로가기
Delvelopment/Kafka

[Java] Synchronize (동기화) 방법 3가지

by 제제킴 2022. 2. 20.
반응형

동기화는 여러 개의 쓰레드가 하나의 자원(리소스)에 접근하려 할 때 주어진 순간에는 단 하나의 쓰레드만 접근 가능 하도록 하는 것이다.

둘 이상의 쓰레드가 공동의 자원(파일이나 메모리 블록)을 공유하는 경우, 순서를 잘 맞추어 다른 쓰레드가 자원을 사용하고 있는 동안 한 쓰레드가 절대 자원을 변경할 수 없도록 해야한다. 만약 한 쓰레드가 파일에서 레코드를 수정하는데, 다른 쓰레드가 동시에 같은 레코드를 수정하면 심각한 문제가 발생할 수 있기 때문입니다.

이런 상황을 처리할 수 있는 한 방법은 관련된 쓰레드에 대한 동기화를 하는 것이다.

동기화를 하는 방법 → 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;
}
반응형

댓글