[F-lab 모각코 챌린지 40일차] TIL

JeongheeKim·2023년 7월 10일

TIL

목록 보기
40/66

학습계획


  • 직렬화 보충
  • synchronized
  • Atomic 클래스 Wrapper

Today I Learned


multi thread 환경에서 Concurrent programming 방법

Concurrent programming이란?

내부적으로 반복적으로 task변경 작업을 통해 마치 동시에 일어나는것처럼 보이는것

synchronized

  • synchronized가 동작하는 방식 synchronized 키워드는 다른 쓰레드에서 메소드를 변경하려고 하면 먼저 들어온 쓰레드가 종료될때까지 대기하거나 중단된다. 일종의 락을 잡아서 다른 스레드의 접근을 막는다.그러므로 여러 쓰레드 작업이 수행되도 동기적인 처리가 된 결과를 얻을 수 있다.
  • 단점 중단된 쓰레드를 다시 깨우는 것은 비용이 많이 들고 성능상 영향을 많이 끼친다.
public class CounterNumber {
	private static int num = 0;

	public synchronized static void increaseNum() {
		num ++;
	}

	public static int getNum() {
		return num;
	}
}

실제 클래스 변수에 접근하여 동작을 수행하는 메서드에 synchronized 키워드를 추가하였다.

Atomic 클래스 Wrapper

Atmoic 클래스는 java.util.concurrent.atomic 패키지에서 제공되며, 멀티 쓰레드 환경에서 잠금이 없으며, concurrency(동시성) 문제 발생 시 사용된다.

동시성 접근이 발생하는 변수를 atomic 변수로 선언하여 원하는 값을 얻을 수 있다.

public class CounterNumber {
	private static AtomicInteger num = new AtomicInteger();

	public static void increaseNum() {
		num.incrementAndGet();
	}
	public static int getNum() {
		return num.get();
	}
}

하지만 Atomic 클래스는 어떻게 thread safe한 결과를 얻어 낼 수 있을까?

Atmoic 클래스는 내부적으로 CAS알고리즘에 의해 동작한다.

CAS(Compare-and-swap)
CAS알고리즘은 메모리에 저장된 값을 읽어와 기대하는 값과 비교한 후 같으면 새로운 값을 저장하는 작업을 말한다.

multi core, multi-thread환경에서 CPU 메인 메모리에서 변수값을 참조하는게 아닌 캐시 영역에서 메모리 값을 참조한다고 한다. 메인메모리값과 캐시 영역의 값이 다른 경우가 있는데 이를 가시성 문제가 있다고 한다. 이를 방지하기 위해 위의 CAS알고리즘이 사용된다고 한다.

❓Custom Exception 클래스 만들면 versionUID 오버라이딩 하는 이유는 ?

Untitled

custome exception을 구현할때 상속받는 Runtime Exception은 Serializable 인터페이스를 구현하고 있다.

Serializable 인터페이스를 구현하고 있다는 것은 JVM 에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있음을 뜻한다. Serializable 인터페이스 구현 함과 동시에 serialversionUID값을 지정하는것을 권장하는데 이는 컴파일 시 자동으로도 생성된다.

자동 생성되는 serialversionUID값은 컴파일러가 클래스의 구조, 멤버변수, 메서드 등을 기반으로 생성한다. 하지만 클래스의 구조가 변경되거나 버전 관리를 위해 serialversionUID를 유지하고 싶다면 프로그래머가 명시적으로 값을 선언해줘야한다.

직렬화 보충

자바 직렬화란?

  • 목적 : 자바시스템간의 데이터 전송
  • 자바 내부 시스템에서 사용되는 객체를 외부의 자바 시스템에서도 사용할 수 있또록 바이트 형태로 데이터를 변환하는것, 반대로 변환된 바이트 단위 데이터를 다시 객체로 역 직렬화 하는것을 뜻한다.
  • 메모리 적으로는 JVM의 메모리에 상주되어있는(heap or stack) 객체 데이터를 바이트 형태로 변환하고 반대로 다시 변환하여 JVM에 저장하는 것
  • 장점) 데이터 전송 시 데이터 타입이 자동으로 맞춰지기때문에 개발자의 편의성이 올라간다.

[참고]

https://www.geeksforgeeks.org/different-approaches-to-concurrent-programming-in-java/

https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/atomic/package-summary.html

https://www.baeldung.com/java-atomic-variables

0개의 댓글