Recent Posts
Recent Comments
Link
관리 메뉴

NaggingMachine

Java의 ThreadLocal 사용해서 Singleton 구현하기 본문

TechnoBabbler

Java의 ThreadLocal 사용해서 Singleton 구현하기

naggingmachine 2013. 3. 20. 19:17

아주 아주 오랫만에 기술 자료 공유, 혹시나 참고하실 만한 분이 있을까 싶어서 올립니다.


Singleton 구조에서 스레드를 사용하면 데이터가 꼬이게 되는데, 그걸 ThreadLocal로 막을 수가 있더군요. 물론  Singleton을 반드시 사용해야 하는 경우에만 해당됩니다. 


소스 코드는 첨부했어요. 테스트만 해보려고 만들었습니다. ^^


감사합니다~!


public class ThreadLocalTestMain implements Runnable {

public static void main(String[] args) {

ThreadLocalTestMain r = new ThreadLocalTestMain();

Thread t1 = new Thread(r);

Thread t2 = new Thread(r);

Thread t3 = new Thread(r);

t1.start();

t2.start();

t3.start();

}



// 이건 전통적인 Singleton

public void run() {

Singleton2 obj = Singleton2.getInstance();

while(true) {

obj._count++;

System.out.println(String.format("%d: %d", Thread.currentThread().getId(), obj._count));

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}


// 이건 ThreadLocal을 적용한 Singleton

// public void run() {

// ThreadLocal<Singleton> instance = Singleton.getInstance();

// Singleton obj = instance.get();

//

// while(true) {

// obj._count++;

// System.out.println(String.format("%d: %d", Thread.currentThread().getId(), obj._count));

// try {

// Thread.sleep(100);

// } catch (InterruptedException e) {

// e.printStackTrace();

// }

// }

//

// }

}



public class Singleton {
private static ThreadLocal<Singleton> _instance;
public int _count;
public static ThreadLocal<Singleton> getInstance() {
if (_instance == null) {
_instance = new ThreadLocal<Singleton>(){
@Override
public Singleton initialValue() {
return new Singleton();
}
};
}
return _instance;
}
}


public class Singleton2 {
private static Singleton2 _instance;
public int _count;
public static Singleton2 getInstance() {
if (_instance == null) {
_instance = new Singleton2();
}
return _instance;
}
}