본문 바로가기
백엔드/Java

멀티스레드 처리

by 1005ptr 2020. 12. 7.
반응형

내 뒤에 앉아있는 회사 동료와 멀티스레드 관련해서 대화한 내용을 기록한 것.

기존 시스템에 추가 기능을 개발할 때는 항상 신경을 써야한다.

 

- 상황 -

기존에 다른 서버로 요청을 보내는 메서드가 있고

그 메서드를 주기적으로 호출하는 타이머가 있었다.

 

그런데 이 처리하는 부분이 어떤 문제로 동작안하는 경우가 있어서

안전장치 느낌으로 같은 메시지를 다른 루트로 받아서 보내는 코드가 추가됐다.

 

호출하는 루트가 추가돼서 멀티스레드환경이 된것이다.

 

- 문제점 -

  1. 멀티스레드 처리를 안해서 동시 접근하여 예외 발생
    • 이 경우 메서드를 동기화처리해서 마무리
  2. 같은 메시지가 여러번 간다.
    • 거의 대부분 여러번 간다.
    • 문제가 생겨서 껐다 켜지는 사이를 빼고는 항상 여러번 간다.
    • 여러번 간다고 동작에 문제가 생기는 것은 아니다.
    • 같은 메시지 한번 보내고싶으면?
  3. 데드락이 안걸렸으면 좋겠다.
    • 이번에는 사용중인지 아닌지 판단하는 boolean 변수를 추가하는경우 생기는 문제
    • 어떤 문제로 boolean 값을 true로 했다가 false로 못바꾼 경우 영원히 메시지는 가지 않는다.
    • 그래서 변수 함부로 추가하는거 아니다.
  4. 우선순위가 떨어져 실행안되고 남아있는 스레드가 생기지 않았으면 좋겠다.
    • 이건 요청 간 우선순위가 있는 경우
    • 일정 시간이 지나면 우선순위를 올려주는 기능
    • 1순위 스레드가 계속 쌓이는 경우 2순위 쓰레드는 무한히 남아있게 된다. 

- 해결 -

요청하는 자들은 지금은 두개지만 더 늘어날 수 있다.

현재는 같은 데이터에 접근해서 직접 요청하기 때문에 문제가 발생한다.

내가 생각하기에는

요청자는 요청 큐에 요청을 추가한다.

요청 큐는 BlockingQueue를 쓴다.

보내는쪽에 스레드 하나 만들어서 큐에서 하나씩 값을 꺼낸다.

 

이렇게 해두면 깔끔하다.

내가 직접 멀티스레드 방지를 한다고 뭘 하지 않기 때문이다.

- 추가 -

여기저기 검색해보다가 본 글이다.

아 변수가 캐싱되서 저렇게 될 수도 있구나..

근데 아직 volatile 써본적은 없다.

https://jeong-pro.tistory.com/227

 

자바 동기화, 어설프게 아는 사람이 더 무섭다(java synchronized에 대한 착각, thread-safe)

'동기화'문제로 고민한 썰 동기화 문제 이펙티브 자바를 읽던 중, 아이템 78에 있는 자바 동기화 문제로 다양한 상상(?)을 했던 썰을 풀려고 합니다. import java.util.concurrent.TimeUnit; public class Main {..

jeong-pro.tistory.com

 

반응형

댓글