[Java] 동시성 이슈

해니·2024년 3월 8일
0

Java

목록 보기
12/34
post-thumbnail

동시성과 병렬성

이미지 출처 : [Java Study] - 멀티 쓰레드(쓰레드 생성과 실행)


동시성(Concurrency)

  • 싱글 코어에서 멀티 스레드를 동작시키기 위한 방식으로, 멀티 태스킹을 위해 여러 개의 스레드가 번갈아가면서 실행되는 성질

병렬성(Parallelism)

  • 멀티 태스킹을 위해, 멀티 코어에서 개별 스레드를 동시에 실행하는 성질

💡싱글 코어 CPU를 이용한 멀티 스레드 작업은 병렬적으로 실행되는 것처럼 보이지만, 사실은 번갈아가면서 실행하는 동시성 작업이다.번갈아 실행하는 것이 워낙 빨라서 병렬성으로 보일 뿐이다.




스레드 안전성(Thread safe)

  • 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것
  • 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바르게 나오는 것

💡 Thread-sae하다라는 의미는 두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산 결과는 정합성이 보장될 수 있게 메모리 가시성이 확보된 상태이다.




동시성 이슈 해결 방안

synchronized 키워드

  • synchronized 가 선언된 블럭에는 동시에 하나의 스레드만 접근할 수 있다.
  • 갱신 손실(Lost Update) 문제
    • 여러 트랜잭션이 한 개의 객체(row)에 동시에 접근해서 가장 마지막에 진행된 갱신만 적용되고 이전 트랜잭션들이 갱신한 값들은 모두 무효 처리가 되는 것

@Transactional과 synchronized를 같이 사용할 때의 문제점

  • @Transactional을 사용하면 Spring AOP로 인해 프록시 객체가 만들어지고, 트랜잭션이 커밋되기 전에 다른 스레드가 데이터를 읽었기 때문에 갱신 손실 문제를 해결할 수 없다.
  • synchronized 키워드는 동일한 프로세스 내의 스레드 단위에서만 동시성을 보장한다.
    • 여러 대의 서버를 활용하면 동시성을 보장할 수 없다.

💡 Java의 synchronized는 요청이 많은 경우 성능 저하가 심하고, 서버가 여러 대일 경우 갱신 손실 문제를 해결할 수 없기때문에 동시성 제어에는 적합하지 않다. 데이터에 직접 락킹을 함으로써 문제를 해결할 수 있으며, 관련한 방법으로는 Pessimistic Lock, Optimistic Lock 등이 있다.




추후에 정리해야 될 개념들 ✅

  • 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)
  • Spring AOP, 프록시 객체





출처
[Java Study] - 멀티 쓰레드(쓰레드 생성과 실행)
[Java] 멀티 스레드환경의 동시성 이슈 그리고 해결방법
스레드 안전(Thread-Safety)란?
자바에서 동시성 문제를 해결하는 3가지 키워드
@Transactional과 synchronized를 같이 사용할 때의 문제점
[CS] 동시성 제어
동시성이슈 2편

profile
💻 ⚾️ 🐻

0개의 댓글