Thread Safe

고장난 고양이·2022년 11월 25일
0

운영체제

목록 보기
21/21
post-thumbnail

☣️ Thread Safe란?

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

💻 Java에서 Thread Safe 하게 코딩하기

1️⃣ Lock - Synchronized 키워드

  • synchronized 키워드를 붙이거나, synchronized 블록을 생성해서 구현할 수 있다.

  • 태그가 붙거나 블록내의 함수 혹은 자원에 대해서는 동시성을 보장해준다.

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

HashMap, ConcurrentHashMap, AtomicInteger, BlockingQueue 등

  • 위의 1번 synchronized로 직접구현하는 것보다 성능이 좋다.

3️⃣ 스택한정 프로그래밍

  • 각 쓰레드에는 각 쓰레드별 스택이 존재로한다.

  • 따라서 모든 스레드는 각자 고유한 스택과 지역변수를 가진다는 특성을 잘 이해하면 동시성을 보장하도록 할 수 있다.

🔑 Thread local

선언한 함수와 변수가 스택에서 나가게 되면 그 기록은 모두 사라진다. 이럴 경우 다른 곳에서 사용이 불가능하다. 이를 해결하기위해 Thread Local을 사용한다.

Thread local을 통해서 특정 쓰레드가 실행하는 모든 코드에서 그 쓰레드에 설정된 변수 값을 사용할 수 있게 된다.

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

4️⃣ 불변객체 사용

  • String은 안전하다. -> 불변객체이기 때문

  • 적절한 final 키워드도 별다른 동기화작업이 없이도 동시성환경에서 자유롭게 사용할 수 있다.

  • 불변객체와 비슷한관점으로 초기화된 이후에 변경될 수 없기 때문에 여러스레드가 동시에 접근해도 동일한 값을 보장받을 수 있기 때문이다.

✅ 참고

https://sup2is.github.io/2021/05/03/thread-safe-in-java.html

profile
개발새발X발일지

0개의 댓글