JAVA

Java Thread Safety 한 개발

devchive 2023. 8. 29. 18:23

Thread Safe

개발을 하다보면 Multi-Thread 환경에서 작업해야하는 경우가 있다. 이때 공유되는 자원등에 대해 Thread-safe 하게 작업하는것이 중요하다. Thread-safe 하나는것은 여러 스레드에서 클래스 혹은 객체헤 동시에 접근하여도 정확하게 동작하는것을 의미한다.

 

Thread Safe 하게 개발하기

Synchronized

Java에서 가장 간단하게 Thread-Safety 하게 개발하는 방법은 synchronized keyword를 사용하는 것이다.

    public class IncreaseNumber{
        public int number;

        public synchronized int increase(){
            return number++;
        }
    }

위처럼 synchronized keyword를 이용하면 increase()함수를 실행했을때 정확한 값을 받을 수 있다. 또 아래와 같이 synchronized keyword를 코드 블록에 적용할 수 있다.

public class ThreadSafety {
    private final Object myLock = new Object();
    public int val;

    void sync(){
        synchronized (myLock){
            val++;
        }
    }
}

Java의 concurrent 패키지

위에서 설명한 synchronized 의 가장 큰 단점은 성능을 보장하기 힘들다는 것이다. synchronized 대신 java.concurrent 패키지의 자료구조들을 이용할 수 있다면 사용하는것이 더 좋다.

 

Stack 한정 프로그래밍

Thread는 각자 스택이라는 공간을 할당받는다. 이 고유햔 stack 영역에 한정하여 프로그래밍을 하면 Thread-safe 하게 개발할 수 있다.

 

ThreadLocal

위의 stack 영역 프로그래밍은 메서드 스택을 벗어나면 변수를 참조할 수 없다. 이를 위해 ThreadLocal 이라는 클래스를 이요하는 방법이 있다. ThreadLocal을 이용하면 Thread 영역에 변수를 할당할 수 있기에 해당 Thread의 모든 코드에서 이 변수에 접근할 수 있다.

 

참고

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