이미지 출처 : [Java Study] - 멀티 쓰레드(쓰레드 생성과 실행)
💡싱글 코어 CPU를 이용한 멀티 스레드 작업은 병렬적으로 실행되는 것처럼 보이지만, 사실은 번갈아가면서 실행하는 동시성 작업이다.번갈아 실행하는 것이 워낙 빨라서 병렬성으로 보일 뿐이다.
💡
Thread-sae하다라는 의미는 두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산 결과는 정합성이 보장될 수 있게 메모리 가시성이 확보된 상태이다.
synchronized 가 선언된 블럭에는 동시에 하나의 스레드만 접근할 수 있다.@Transactional을 사용하면 Spring AOP로 인해 프록시 객체가 만들어지고, 트랜잭션이 커밋되기 전에 다른 스레드가 데이터를 읽었기 때문에 갱신 손실 문제를 해결할 수 없다.synchronized 키워드는 동일한 프로세스 내의 스레드 단위에서만 동시성을 보장한다.💡 Java의
synchronized는 요청이 많은 경우 성능 저하가 심하고, 서버가 여러 대일 경우 갱신 손실 문제를 해결할 수 없기때문에 동시성 제어에는 적합하지 않다. 데이터에 직접 락킹을 함으로써 문제를 해결할 수 있으며, 관련한 방법으로는Pessimistic Lock,Optimistic Lock등이 있다.
추후에 정리해야 될 개념들 ✅
출처
[Java Study] - 멀티 쓰레드(쓰레드 생성과 실행)
[Java] 멀티 스레드환경의 동시성 이슈 그리고 해결방법
스레드 안전(Thread-Safety)란?
자바에서 동시성 문제를 해결하는 3가지 키워드
@Transactional과 synchronized를 같이 사용할 때의 문제점
[CS] 동시성 제어
동시성이슈 2편