
안녕하세요
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();
}
}
- ThreadLocal 객체를 생성합니다
- ThreadLocal.set()으로 현재 스레드의 로컬 변수에 값을 저장합니다
- ThreadLocal.get()으로 현재 스레드의 로컬 변수 값을 조회합니다.
- 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 |