검색결과 리스트
글
자바 세마포어( JAVA Semaphore )
- 프로세스간 메세지 전송을 하거나, 혹은 공유메모리를 통해서 특정 data를 공유하게 될경우
발생하는 문제는, 공유된 자원에 여러개의 프로세스가 동시에 접근을 하면서 발생한다.
단지 한번에 하나의 프로세스만 접근 가능하도록 만들어 줘야 하고,
이때 세마포어를 쓴다.
- 쓰레드에서는 뮤텍스, 프로세스에서는 세마포어
- 교착상태
A 프로세스가 k 에 접근하고 나오면 k = 2 라는 값을 예상할수 있다.
A 프로세스가 k 에 접근했을때, B 프로세스가 k 에 접근을 하고 일을 하고 나오면, k = 2 가 되고,
A 프로세스가 그후로 일을 하면 k = 3 이 된다.
즉, 예상한 값을 얻을수 없다.
이를 방지 하기 위해,
A 프로세스가 접근 했을때 다른 프로세스의 접근을 막고,
끝난후 접근을 풀어 준다.
이를 세마포어로 접근을 막고 접근을 허용 할수 있다.
- 차단을 원하는 자원에 대해서 semaphore를 생성하면 해당자원을 가리키는
semaphore 값이 할당 된다.
이 값이 0 이면 해당자원에 접근할수 없고,
0 보다 크면 해당자원에 접근할수 있다.
- 그러므로, 자원에 접근하기 전에 semaphore 값을 검사해서
값이 0이면 자원을 사용할수 있을때까지 기다리고,
0보다 더 크면 자원에 접근해서 semaphore 값을 0 으로 감소 시켜서,
다른 프로세스가 자원에 접근 할수 없도록 하고,
자원의 사용이 끝나면 다시 semaphore 값을 증가 시켜 다른프로세스가 사용할수 있게 해준다.
==== 세마포어 예제 ===
package mvnoServer;
import java.util.concurrent.Semaphore;
public class semaphoer_test
{
public static void main(String[] args)
{
Semaphore se = new Semaphore(3);
SyncMulti th1 = new SyncMulti(se,"1");
SyncMulti th2 = new SyncMulti(se,"2");
SyncMulti th3 = new SyncMulti(se,"3");
SyncMulti th4 = new SyncMulti(se,"4");
th1.start();
th2.start();
th3.start();
th4.start();
}
}
-----------------------------------------------
package mvnoServer;
import java.util.concurrent.Semaphore;
public class SyncMulti extends Thread
{
// 동시에 수행될 수 있는 스레드의 개수를 설정 하는 클래스
Semaphore sem;
String msg;
public SyncMulti(Semaphore sem, String msg)
{
super();
this.sem = sem;
this.msg = msg;
}
public void run()
{
try
{
sem.acquire(); //실행한다.
System.out.println(msg);
Thread.sleep(5000); //5초간 딜레이
sem.release(); //끊어준다
//세마포어를 실행시키고 5초 후에는 세마포어를 끊어준다.
}
catch(Exception e)
{
}
}
}
=================================================
결과값.
1,2,3 이 시작되고, 5초 후에 4가 실행된다.
'개발 > 이론' 카테고리의 다른 글
MVC 1, MVC 2 차이 (0) | 2017.12.06 |
---|---|
자바 Referenced Libraries 만들기 (0) | 2013.10.08 |
9월 11일 (0) | 2013.09.12 |
9월 9일 (0) | 2013.09.12 |