2012-03-07 2 views
3

Java의 모니터 개념을 사용하여 세마포를 구현하려고합니다.모니터 개념을 사용하여 세마포를 구현하십시오.

class MyMonitor 
{ 
    int counter = 0; 

    //init 
    public MyMonitor(int init) 
    { 
     counter = init; 
    } 

    //Signal 
    public synchronized void S() 
    { 
     counter++; 
     notify(); 
    } 

    //Wait 
    public synchronized void W() 
    { 
     if(counter == 0) 
     { 
      try 
      { 
       wait(); 
      } 
      catch(InterruptedException e) { } 
     } 

     counter--; 
    } 
} 

이 인 경우 : (사용 방법, 신호를 init를 기다립니다) (문제가 무엇인가하지 않은 경우)

가 이 클래스가 맞다면 누군가가 나에게 말해 줄 수

약한 계수 세마포어를 구현 즉 자바 클래스 올바른, 누군가가 내게 수업을 시험 할 수있는 방법에 대한 아이디어를 줄 수 있겠습니까?

if(counter == 0) 
    { 
     try 
     { 
      wait(); 
     } 
     catch(InterruptedException e) { } 
    } 

    counter--; 

스레드가 기다리는 동안, 그것은 단순히 if 문을 종료 0 아래의 카운터를 감소 다음 세마포어 시스템이 끔찍하게 진행됩니다 중단됩니다 경우

답변

0

그럼 내가 볼 수있는 유일한 문제는이 부분이다 이제는 아무도 기다려야합니다. counter은 0보다 작습니다.

ifwhile으로 바꿔야 할 수도 있습니다.

+1

다른 r eason은 '거짓'을 사용합니다. – zch

+0

@zch : 좋은 지적입니다. – Tudor

1

그것은 (ifwhile하지)과 같이해야한다 : 어떻게 시험에

class YourMonitor 
{ 
    int counter = 0; 

    //init 
    public MyMonitor(int init) 
    { 
     counter = init; 
    } 

    //Signal 
    public synchronized void S() 
    { 
     counter++; 
     notifyAll(); 
    } 

    //Wait 
    public synchronized void W() throws InterruptedException 
    { 
     while (counter <= 0) 
     { 
      wait(); 
     } 

     counter--; 
    } 
} 

: 세마포어없이

public class TestYourSemaphore 
{ 
    private static final int CNT = 100000; 

    private int x = 0; 
    private YourSemaphore s = new YourSemaphore(); 

    public void run() throws InterruptedException 
    { 
     Thread t1 = new Thread(new MyRunnable()); 
     Thread t2 = new Thread(new MyRunnable()); 
     Thread t2 = new Thread(new MyRunnable()); 

     t1.start(); 
     t2.start(); 
     t3.start(); 

     t1.join(); 
     t2.join(); 
     t3.join(); 


     // Verify, that the X has correct value 
     if (x != 3 * CNT) 
     { 
      throw new RuntimeException("Race condition error!"); 
     } 
     System.out.println("Finished"); 
    } 

    private class MyRunnable implements Runnable 
    { 
     @Override 
     public void run() 
     { 
      for (int i = 0; i < CNT; i++) 
      { 
       //un-comment to use Semaphores 
       //s.enter(); 
       x = x + 1; 
       //s.leave(); 
      } 
     } 
    } 
} 
  • 는, 예외는 항상 슬로우됩니다 (거의) .
  • 제안 된 세마포를 사용하면 예외가 throw되지 않습니다.
  • 세마포어를 사용하면 예외가 종종 발생하지만 (세마포어가 없으면 자주 발생하지는 않음)

당신의 세마포 문제는 :

  1. 스레드 1
  2. 스레드 1 전화 notifyAll()
  3. 실이 동시에 3을 보내고 잠금
  4. 실 2 실 3이다 wait()있다 중요한 섹션을 입력하십시오. 어떤 것이 좋지 않습니까?
+0

notify()를 notifyAll()으로 대체 한 이유를 이해할 수 없습니다. notifyAll()을 사용하지 않으면 문제가 발생하지 않습니다. 정확히 말하면 1 개의 스레드가 발생하기 때문입니다. 다른 설명에 설명 된 가짜 깨우기를 여기에서 고려한다고해도 notifyAll()에 대한 이유는 없습니다. –

관련 문제