Concurrent programming이란?
내부적으로 반복적으로 task변경 작업을 통해 마치 동시에 일어나는것처럼 보이는것
synchronized 키워드는 다른 쓰레드에서 메소드를 변경하려고 하면 먼저 들어온 쓰레드가 종료될때까지 대기하거나 중단된다. 일종의 락을 잡아서 다른 스레드의 접근을 막는다.그러므로 여러 쓰레드 작업이 수행되도 동기적인 처리가 된 결과를 얻을 수 있다.public class CounterNumber {
private static int num = 0;
public synchronized static void increaseNum() {
num ++;
}
public static int getNum() {
return num;
}
}
실제 클래스 변수에 접근하여 동작을 수행하는 메서드에 synchronized 키워드를 추가하였다.
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 오버라이딩 하는 이유는 ?

custome exception을 구현할때 상속받는 Runtime Exception은 Serializable 인터페이스를 구현하고 있다.
Serializable 인터페이스를 구현하고 있다는 것은 JVM 에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있음을 뜻한다. Serializable 인터페이스 구현 함과 동시에 serialversionUID값을 지정하는것을 권장하는데 이는 컴파일 시 자동으로도 생성된다.
자동 생성되는 serialversionUID값은 컴파일러가 클래스의 구조, 멤버변수, 메서드 등을 기반으로 생성한다. 하지만 클래스의 구조가 변경되거나 버전 관리를 위해 serialversionUID를 유지하고 싶다면 프로그래머가 명시적으로 값을 선언해줘야한다.
자바 직렬화란?
[참고]
https://www.geeksforgeeks.org/different-approaches-to-concurrent-programming-in-java/