Skip to content

Latest commit

 

History

History
33 lines (19 loc) · 1.88 KB

File metadata and controls

33 lines (19 loc) · 1.88 KB

12.Thread safety 란 뭔가요? 어떻게 구현해야 Thread safe 한 코드를 만들 수 있나요?

Thread Safe란?

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

즉 동시성 보장

Thread Safe한 코드 - java

1. syncronized 사용

  • 이거 선언한 함수 변수는 동시성 보장을 해줌

2. 동시성 보장 자료구조 사용

HashMap, BlockingQueue, ConcurrentHashMap, AtomicInteger 등이 존재

위의 syncronized 키워드에 비해서 직접구현하는것보다 성능이 좋기에 이걸 쓰는 것을 추천

3. final 객체 사용

String는 불변객체라고 한다고함. 그렇기에 반환했을때 문제가 없지만, Date 등 다른 종류들은 가변객체 그럼 일관된 응답이 불가능하다.

이를 방지하고자 final을 선언하여 불변객체로 변환시켜 사용한다.

4. 스택한정 프로그래밍

쓰레드는 각자만의 스택을 가지고 있다. 즉 이걸 잘 이용하면 서로다른 쓰레드간의 동시성을 굳이 고민할 이유가없다는 뜻

다만 스택에서 변수가 나가고나면 기억에서 사라져 사용할 수 없게 된다. 이를 위해 Thread local을 사용한다. Thread local을 통해서 특정 쓰레드가 실행하는 모든 코드에서 그 쓰레드에 설정된 변수 값을 사용할 수 있게 된다.

대표적인 사용 예로 SpringSecurity에서 제공하는 SecurityContextHolder가 바로 ThreadLocal 적절한 예가 된다.

Q&A