1) Java 모니터

public synchronized void insert(E item){
	while(count == BUFFER.SIZE){
		try{
			wait();
		}
		catch (InterruptedException ie){}
	}
		
	buffer[in] = item;
	in = (in +1) % BUFFER.SIZE;
	count++;
		
	notify();
}

public synchronized void remove(E item){
	while(count == 0){
		try{
			wait();
		}
		catch (InterruptedException ie){}
	}
		
	item = buffer[out]
	out = (out + 1) % BUFFER.SIZE;
	count--;
		
	notify();
}
	

2) 재진입 락 (Reentrant Locks)

Lock key = new ReentrantLock();

key.lock();
try{
	/* 제어를 얻어 임계구역에 진입 */
} 
finally{
	key.unlock();
}

------------------------------------------------------------------

// 아래처럼  두 번의 락을 획득하는 것의 불필요한 경쟁을 피하기 위한 재진입 락
public void function(){
	lock()
	
	funciontB();
	
	unlock();
}

public void functionB(){
	lock();
	
	~~~
	
	unlock();
	}

3) 세마포

Semaphore(int value); // value는 초기값을 지정

/*예시*/

Semaphore sem = new Semaphore(1);

try{
	sem.acquire(); //카운팅으로 임계구역 진입 등등
		/* critical section */
}
catch (InterruptedException ie) {}
finally {
	sem.release(); // 세마포 해제
}

4) 조건 변수