2010. 6. 28. 15:52
ThreadLocal
활용 예)
사용 예)
ThreadLocalClass.java
WorkerRunnable.java
- ThreadLocal 변수 사용
- 객체는 할당한 쓰레드에서만 사용할 수 있다.
Business.java
- 객체 사용
UserInfo.java
- 데이터 객체
Launcher.java
- 테스트 클래스
하나의 쓰레드에서 객체를 전파하는 방법으로 파라미터를 사용하기 않고 코드에서 동일한 객체를 사용할 수 있게 해준다.
활용 예)
- 객체를 쓰레드에 안전하게 해준다.
- 쓰레드 단위로 트랜잭션 컨텍스트를 관리하고자 할때 사용.
(static으로 선언된 ThreadLoacl 변수에 트랜잭션 컨텍스트를 넣어두면 쓰레드에 안전하게 사용가능)
- ThreadLocal을 사용하여 공유 데이터를 사용할 때 현재 실행중인 스레드의 정보를 넘겨줘야 할 필요는 없지만, 이런 방법은 해당 프레임웍에 대한 의존성을 가지고 된다.
- 전역변수처럼 사용되기 때문에 일반적인 전역 변수가 갖는 단점처럼 재사용성을 떨어뜨릴 수 있고, 객체 간에 눈에 보이지 않는 연결 관계를 만들어내기 쉽기 때문에 애플리케이션에 어떤 영향을 미치는지 정확하게 알고 사용해야 한다.
- 쓰레드 단위로 트랜잭션 컨텍스트를 관리하고자 할때 사용.
(static으로 선언된 ThreadLoacl 변수에 트랜잭션 컨텍스트를 넣어두면 쓰레드에 안전하게 사용가능)
- ThreadLocal을 사용하여 공유 데이터를 사용할 때 현재 실행중인 스레드의 정보를 넘겨줘야 할 필요는 없지만, 이런 방법은 해당 프레임웍에 대한 의존성을 가지고 된다.
- 전역변수처럼 사용되기 때문에 일반적인 전역 변수가 갖는 단점처럼 재사용성을 떨어뜨릴 수 있고, 객체 간에 눈에 보이지 않는 연결 관계를 만들어내기 쉽기 때문에 애플리케이션에 어떤 영향을 미치는지 정확하게 알고 사용해야 한다.
사용 예)
ThreadLocalClass.java
public class ThreadLocalClass {
public static ThreadLocal<UserInfo> local = new ThreadLocal<UserInfo>();
}
public static ThreadLocal<UserInfo> local = new ThreadLocal<UserInfo>();
}
WorkerRunnable.java
- ThreadLocal 변수 사용
- 객체는 할당한 쓰레드에서만 사용할 수 있다.
public class WorkerRunnable implements Runnable {
private String name;
public WorkerRunnable(String name) {
this.name = name;
}
public void setObject() {
UserInfo info = new UserInfo();
info.setName(name);
ThreadLocalClass.local.set(info);
}
@Override
public void run() {
setObject();
while(true) {
Business business = new Business();
business.logic_01();
}
}
}
private String name;
public WorkerRunnable(String name) {
this.name = name;
}
public void setObject() {
UserInfo info = new UserInfo();
info.setName(name);
ThreadLocalClass.local.set(info);
}
@Override
public void run() {
setObject();
while(true) {
Business business = new Business();
business.logic_01();
}
}
}
Business.java
- 객체 사용
public class Business {
public void logic_01() {
UserInfo user = ThreadLocalClass.local.get();
System.out.println(Thread.currentThread().getName() + ":" + user.getName());
}
}
public void logic_01() {
UserInfo user = ThreadLocalClass.local.get();
System.out.println(Thread.currentThread().getName() + ":" + user.getName());
}
}
UserInfo.java
- 데이터 객체
public class UserInfo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Launcher.java
- 테스트 클래스
public class Launcher {
public static void main(String[] args) {
for(int i = 0;i<10;i++) {
WorkerRunnable w = new WorkerRunnable("bbaeggar : " + i);
Thread t = new Thread(w);
t.start();
}
}
}
public static void main(String[] args) {
for(int i = 0;i<10;i++) {
WorkerRunnable w = new WorkerRunnable("bbaeggar : " + i);
Thread t = new Thread(w);
t.start();
}
}
}
'java > concurrency' 카테고리의 다른 글
[Concurrency] - ExecutorService 를 이용한 동작주기 예제 (0) | 2010.06.29 |
---|---|
[Concurrency] - Executor 를 사용한 thread pool 샘플 (0) | 2010.06.29 |
[Concurrency] - BlockingQueue 과 producer-consumer 패턴 활용법 (0) | 2010.06.29 |
[Concurrency] - Singleton Pattern with java (0) | 2010.06.29 |
[Concurrency] - Callable 를 사용하여 Thread 결과값 받기 (0) | 2010.06.28 |