하나의 인스턴스로 만들어진 여러개의 스레드들은 인스턴스 변수를 공유한다.
그래서 만약 스래들만의 개별적인 정보 저장해야 할 상황에서는 인스턴스 변수로는 부족하다.
자바는 어떤 형식이거나 쓰레드당 개별적인 인스턴스를 생성하고 접근하는 ThreadLocal이라는 클래스를 제공한다.
아래의 예제는 ThreadLocal 을 사용한 예제이다.
counter 변수는 스레드가 공유하게 되는 값이며, threadLocal 변수는 공유되지 않는 각각의 스레드가 가지고 있는 값이다.
counter는 공유되기 때문에 모든 스레드에서 하나의 값을 공통적으로 사용할 수 있고,
threadLocal은 각각의 스레드가 랜덤으로 얻은 값을 가지고 있는 것을 볼 수 있다.
//ThreadLocal Example
import java.util.Random;
public class ThreadLocal1 {
public static void main(String args[]) {
Runnable runner = new Runnable() {
Random random = new Random();
int counter = 0;
ThreadLocal threadLocal = new ThreadLocal();
public void run() {
synchronized (ThreadLocal1.class) {
++counter;
threadLocal.set(new Integer(random.nextInt(1000)));
displayValues(threadLocal.get().toString());
}
try {
Thread.currentThread().sleep(100);
displayValues(threadLocal.get().toString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void displayValues(String str) {
System.out.println(str + "\t"
+ Thread.currentThread().getName() + "\t(counter:"
+ counter + ")");
}
};
for (int i = 0; i < 5; i++) {
Thread t = new Thread(runner);
t.start();
}
}
}
/*결과 화면(랜덤값 스레드 이름 카운터값)
669 Thread-0 (counter:1)
499 Thread-1 (counter:2)
628 Thread-2 (counter:3)
849 Thread-4 (counter:4)
734 Thread-3 (counter:5)
499 Thread-1 (counter:5)
669 Thread-0 (counter:5)
628 Thread-2 (counter:5)
734 Thread-3 (counter:5)
849 Thread-4 (counter:5)
*/
'java' 카테고리의 다른 글
is a has a (0) | 2015.05.15 |
---|---|
generic 타입 추론. (0) | 2015.05.12 |
isAssignableFrom (0) | 2014.12.20 |
StringUtils (0) | 2014.12.19 |
자바 > 크로스도메인 설정 (0) | 2014.08.25 |