java

ThreadLocal 이란?

코딩하는 공부방 2022. 7. 28. 23:22

안녕하세요

Spring을 공부하다가 JAVA 내용을 기억할려고

블로그에다가 정리를 해봐요

저번에는 JAVA의 Collection 부분을 정리를 하였는데요

2022.07.18 - [java] - [Java] 컬렉션 - Collection 이란?

 

[Java] 컬렉션 - Collection 이란?

안녕하세요 오랜만에 Java 공부를 하다가 Collection 부분 블로그 기록 남기는 정리해서 알려드릴게요 Collection 이란? 객체의 모음, 그룹이라고 할 수 있습니다. 자바에서느 값을 저장하는 다양한 컨

nosechild.tistory.com

위에 참고하면 감사하겠습니다

이번에는 공부를 하다가
ThreadLocal 클래스에 대해서 정리를 해보겠습니다.


ThreadLocal

ThreadLocal은 JDK 1.2 부터 제공된 오래된 클래스이다. 이 클래스를 활용하면 스레드 단위로 지역 변수로 사용할 수 있기 때문에 마치 전역변수처럼 여러 메서드에서 활용할 수 있다. Spring에서는 사용자 인증정보 - Spring Security에서 사용자마다 다른 사용자 인증 정보 세션을 사용할 때 사용합니다

Get 또는 Set 메서드를 통해 접근하는 각 스레드가 고유하고 독립적으로 초기화 된 변수의 복사본을 갖는다는 점에서 일반 변수와 다릅니다.

 

한 스레드에서 실행되는 코드가 동일한 객체를 사용할 수 있도록 해주기 때문에 관련된 코드에서 파라미터를 사용하지 않고 객체를 각자가 가져다 쓸 때 사용된다. -> 두 스레드가 같은 코드를 실행하고, 이 코드가 하나의 ThreadLocal 변수를 참조하더라도 서로의 ThreadLocal 변수를 볼 수 없습니다.

●사용방법

public class ThreadLocalTest {
    
    //객체 생성
    public static ThreadLocal<String> mTL = new ThreadLocal<>();

    public static void main(String[] args) {
        
        //스레드의 로컬변수에 값을 저장
        mTL.set("Hello!! I'm NoseChild Blog");

        //mTLValue 값에 스레드 로컬 변수 값을 저장
        String mTLValue = mTL.get();
        System.out.println(mTLValue);
        
        //스레드의 로컬 변수 값을 삭제
        mTL.remove();
    }
}
  1. ThreadLocal 객체를 생성합니다
  2. ThreadLocal.set()으로 현재 스레드의 로컬 변수에 값을 저장합니다
  3. ThreadLocal.get()으로 현재 스레드의 로컬 변수 값을 조회합니다.
  4. ThreadLocal.remove()로 현재 스레드의 로컬 변수 값을 삭제합니다.

●Example

import static java.lang.Math.*;

public class ThreadLocalTest {
    public static void main(String[] args) {
        MyRunnable sharedRunnableInstance = new MyRunnable();

        Thread thread1 = new Thread(sharedRunnableInstance);
        Thread thread2 = new Thread(sharedRunnableInstance);

        thread1.start();
        thread2.start();

        try {
            thread1.join(); //wait for thread 1 to terminate
            thread2.join(); //wait for thread 2 to terminate
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

class MyRunnable implements  Runnable{

    private ThreadLocal<Integer> tl = new ThreadLocal<>();


    @Override
    public void run() {
        tl.set((int)(random() * 100D));

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
        }

        System.out.println(tl.get());
    }
}

주의사항

스레드 풀 환경에서 ThreadLocal 사용 시 , ThreadLocal 변수에 보관된 데이터 사용이 끝나면 반드시 해당 데이터 삭제 필요합니다. 삭제하지 않을 경우, 재사용되는 스레드가 올바르지 않은 데이터를 참조할 수 있습니다.


※참고※

https://velog.io/@yu-jin-song/JAVA-ThreadLocal
https://maivve.tistory.com/331
https://velog.io/@ayoung0073/Java-ThreadLocal

 

'java' 카테고리의 다른 글

Java - Optional 문법  (0) 2022.08.12
[Java] Thread 란?  (0) 2022.07.30
[Java] 컬렉션 - Collection 이란?  (0) 2022.07.18
[Java] Static import 란?  (0) 2022.07.14
[Java] OOP의 다형성 및 SOLID  (0) 2022.07.12