2011년 6월 13일 월요일

JDK 5.0 java.util.concurrent package - 1

JDK 5.0 java.util.concurrent package
동기화(synchronization)는 자바 플랫폼의 최초 릴리즈 이후로 자바 프로그래밍 언어의 한 부분이 되어왔다. 이 지원은 위험한 코드 블럭과 공유 변수들에 대한 동시 접근을 예방하기 위해 만들어졌다. 동기화는 사용자가 메소드에 synchronized 키워드 추가 또는 동기화 블록의 코드 래핑(wrapping)중에서 선택할 수 있도록 한다. J2SE5.0에서는 애플리케이션의 다른 쓰레드 간의 조화를 위한 몇 가지 절차가 추가되었다. 이 추가된 지원은 새로운 java,util.concurrent package에 의해 제공된다.

1. Semaphore
IS ?
프로그래밍에서 세마포어는 운영체계의 자원을 경쟁적으로 사용하는 다중 프로세스에서, 행동을 조정하거나 또는 동기화 시키는 기술이다. 세마포어는 운영체계 또는 커널의 한 지정된 저장장치 내 값으로서, 각 프로세스는 이를 확인하고 변경할 수 있다. 확인되는 세마포어의 값에 따라, 그 프로세스가 즉시 자원을 사용할 수 있거나, 또는 이미 다른 프로세스에 의해 사용 중이라는 사실을 알게되면 재시도하기 전에 일정 시간을 기다려야만 한다. 세마포어는 이진수 (0 또는 1)를 사용하거나, 또는 추가적인 값을 가질 수도 있다. 세마포어를 사용하는 프로세스는 으레 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 기다리도록 해야한다.

세마포어들은 일반적으로 메모리 공간을 공유하거나, 또는 파일들을 공유 액세스하기 위한, 두 가지 정도의 목적을 위해 사용된다. 세마포어들은 프로세스간 통신(IPC)을 위한 기술 중하나이다. C 프로그래밍 언어는 세마포어들을 관리하기 위한 일련의 인터페이스 또는 함수들을 제공한다. 이 세마포어를 가지고 경쟁관계에 있는 자원들을 충돌없이 잘 사용하기 위함입니다. 공유자원의 경우 다른 프로세스가 동시에 접근을 한다면, 어느 프로세스에 의해 변경된 자료가 나중에 수정된 자료인지 모르게 되는 문제가 생기며, 이로 인해 데이터의 각종 오류가 산재하게 됩니다. 그래서 세마포어 라는 일종의 변수를 두어 제어를 하게 됩니다.

Semaphore Class
일부의 (물리 또는 논리) 자원에 액세스 가능한 thread의 수를 제한하는 경우에 자주 사용한다.
- is lock : 멀티 쓰레드에 의해 공유되는 리소스에 접근을 제어, 일반적으로 lock은 공유 리소스에 독점적인 접근을 제공한다. 한번에 단지 하나의 쓰레드만이 lock을 얻을 수 있으며 공유 리소스에 접근하기 위해선 먼저 lock이 취득되어야 한다.
- is permit : semaphore에 관계된 lock을 얻기 위한 티켓이나 토큰과 같다. semaphore는 일반적으로 리소스의 제한된 pool에 대해 permit 상태를 유지한다. 쓰레드는 pool에서 리소스를 얻기 위해 반드시 semaphore 부터 permit을 취득해야 하며 사용이 끝나면 얻어진 리소스는 poolfh 되돌려진다. 그 후 permit은 sermaphore에 리턴되어 다른 쓰레드가 그 리소스를 얻을 수 있도록 한다.
- is block : 쓰레드가 공유 리소스에 접근할 수 있기 위해 요청된 lock이나 permit을 기다리는 것을 의미한다.
아래의 Sample은 Semaphore의 수를 2개로 지정하고 100개의 쓰레드가 접근 했을 경우 permit을 획득하면 랜덤 값을 획득하지 못하면 20을 리턴 받게 된다.
package sun.tips;
import java.util.Random;
import java.util.concurrent.Semaphore;
public class Pool extends Thread {
private static final int LOOP_COUNT = 100;
private static final int MAX_AVAILABLE = 2;
private final static Semaphore semaphore =
new Semaphore(MAX_AVAILABLE, true);
// 내부 class Pricer
private static class Pricer {
private static final Random random = new Random();
public static int getGoodPrice() {
int price = random.nextInt(100);
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
return price;
}
public static int getBadPrice() {
return 20;
}
}
public static void main(String args[]) {
for (int i=0; i<LOOP_COUNT; i++) {
final int count = i;
new Thread() {
public void run() {
int price;
if (semaphore.tryAcquire()) {
try {
System.out.println("OK("+count+") -- Semaphore permit 획득.");
price = Pricer.getGoodPrice();
} finally {
semaphore.release();
}
} else {
System.out.println("NO("+count+") -- Semaphore permit 획득할 없음.");
price = Pricer.getBadPrice();
}
System.out.println(count + ": " + price);
}
}.start();
}
}
}


Semaphore Class의 Method
acquire()
이 semaphore로부터 파 미트를 취득해, 이용 가능하게 될 때까지 블록을 실행합니다.
acquire(int permits)
semaphore로부터 지정수의 파 미트를 취득해, 모든 것이 이용 가능하게 될 때까지 블록을 실행합니다
tryAcquire()
호출시에 파 미트가 이용 가능한 경우에게만, 이 semaphore로부터 파 미트를 취득합니다.
tryAcqurie(int permits)
호출시로 지정수의 파 미트를 모두 이용 가능한 경우에게만, 파 미트를 이 semaphore로부터 취득합니다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

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