2013년 7월 12일 금요일

Static 변수와 ThreadLocal

하나의 VM에서 Port을 다르게 하여 여러 Server을 띄우고 있는데. Server 단위에서 공유하는 Context을 Singleton으로 구현했다가. 모든 Server가 공유하는 바람에 문제가 생겼음.
왜 이런 기초적인 실수를 했던 것일까.. 그래서 Context을 각 Server마다 Threadlocal 변수로 정의하여 해결. Threadlocal을 실제 사용해본 것음 처음이라. 간단하게 테스트 코드를 만들어 실행해보고 적용하였다.

public class WhatIsThreadLocal {
public static void main(String[] args) {
for(int i=0; i<50; i++) {
Thread t = new Thread(new myJob());
t.setName("t"+i);
t.start();
}
}
}

class myJob implements Runnable {

public static int staticV = 0;
public int classV = 0;
public static ThreadLocal<Integer> staticT = new ThreadLocal<Integer>();
public void run() {
staticV++;
classV++;
Integer st = staticT.get();
if(st == null) {
st = 1;
} else {
st = st+1;
}
staticT.set(1);
System.out.println(Thread.currentThread().getName()+".staticV:"+staticV);
System.out.println(Thread.currentThread().getName()+".classV:"+classV);
System.out.println(Thread.currentThread().getName()+".staticT:"+staticT.get());
new myTask().task();
}
}

class myTask {
public void task() {
int st = myJob.staticT.get();
st++;
myJob.staticT.set(st);
System.out.println(Thread.currentThread().getName()+
".staticT.myTast:"+myJob.staticT.get());
for(int i=0; i<5; i++) {
new myTaskRun().run();
}
}
}

class myTaskRun implements Runnable {
public void run() {
int st = myJob.staticT.get();
st++;
myJob.staticT.set(st);
System.out.println(Thread.currentThread().getName()+
".staticT.myTast.myTaskRun:"+myJob.staticT.get());
}
}

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...