https://computerlove.tistory.com/entry/%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%AC%B8%EC%A0%9C-2
Synchronized를 활용하여 Race Condition을 해결해보았다
하지만, Synchronized를 활용해도 문제점이 생길 수 있다
- 자바의 synchronized는 하나의 프로세스 안에서만 보장이 된다
- 서버가 한 대일 때는 데이터의 접근을 서버가 한대만 해서 괜찮겠지만 서버가 두 대 이상인 경우에는 데이터 접근을 여러 서버에서 할 수 있게 된다
- 예)
Time | Server-1 | Stock | Server-2 |
10 : 00 | select * from stock where id = 1 |
{id: 1, quantity : 5} | |
{id: 1, quantity : 5} | select * from stock where id = 1 |
||
10 : 05 | update set quantity = 5 from stock where id = 1 |
{id: 1, quantity : 4} | |
{id: 1, quantity : 4} | update set quantity = 4 from stock where id = 1 |
- 서버 1에서 10시에 재고 감소 로직을 시작하고 10시 5분에 종료하게 된다
- 서버 2에서 10시 ~ 10시 5분 사이에 갱신되지 않은 데이터를 가져가서 새로운 값으로 갱신을 할 수 있게 된다
- synchronized는 각 프로세스 안에서만 보장이 되기 때문에 결국 여러 스레드에서 동시에 데이터에 접근을 할 수 있게 되면서 Race Condition이 발생하게 된다
- 이런 문제 때문에 실무에서는 synchronized를 사용하는 빈도가 적다고 한다(대부분 서버를 한 대 이상)
'CS지식들 > 공부공부' 카테고리의 다른 글
인증(Authentication) 관련 Exception을 제어하는 기능 구현 (0) | 2023.03.09 |
---|---|
Spring Security filterChain (0) | 2023.03.06 |
동시성 문제 (2) (0) | 2022.12.19 |
동시성 문제 (1) (0) | 2022.12.18 |
JPA에서 페이징/정렬 처리하기 (0) | 2022.11.30 |