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());
}
}

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...