문제

누군가에서는 작업 단지 요청에 대한 뒤에는 포장기 내부의 동기화됩니다.

솔직히 난 볼 수 없습니다 추론이다.내가 무엇인지 이해하 javadocs 말--스레드에 할 필요가 소유자의 객체의 모니터,그런데 왜?무엇이 문제는 그것을 방지 할 수 있습니까?(만약 그것이 실제로,필요한 수 없는 이유는 무엇을 기다릴 방법을 얻을 모니터링까요?)

내가 찾는 것은 매우 깊이 있는 이유이나 어쩌면 참조 문서입니다.내가 하나를 찾을 수 없습니다에 빠른 google.

Oh,또한,어떻게 실을 뀁니다.잠 비교합니까?

편집:훌륭한 설정의 답변-가 하나 이상을 선택하기 때문에 그들은 모든을 이해하는데 도움을 줬습니다 무슨 일이 있었는지 알고 있습니다.

도움이 되었습니까?

해결책

을 경우 객체지 않는 자신의 개체 모니터링을 호출할 때 개체입니다.wait()되지 않을 것입니다에 액세스할 수 있는 객체를 설정 알림 수신기까지 모니터를 출시했습니다.대신,그것으로 처리됩 스레드에 액세스하려고 시도하는 방법에 동기화 개체입니다.

또는 다른 방법을 넣어,사이에 차이가 없다:

public void doStuffOnThisObject()

다음과 같은 방법:

public void wait()

모두 방법이 될 때까지 차단체 모니터링은 발표했다.이 기능에 자바를 방지하의 국가에서 객체에 의해 업데이트되고 있는 더 이상 하나의 스레드가 있습니다.그것은 단순히 의도하지 않은 결과에 wait()메소드가 있습니다.

아마도,wait()메소드가 동기화되지 않기 때문에 만들 수 있는 상황이 스레드가 여러 잠금에서 객체입니다.(참조하십시오 Java 언어양/잠금 더 많은 정보를 원합니다.) 여러 잠금기 때문에 문제가 wait()메소드는 것 하나만을 취소 잠금입니다.는 경우 방법이 동기화되었,그것은 보증하는 유일한 방법의 자물쇠 것입 취소하는 동안 여전히 떠나는 잠재적인 외부 자물쇠 취소할 수 있습니다.이들 교착 상태에서의 코드입니다.

당신의 질문에 대답에서 실을 뀁니다.잠(),스레드가 있습니다.잠()을 보장하지 않는 조건과 상관없이 당신을 기다리고 있에 대을 충족하고있다.를 사용하여 개체입니다.wait()및 그 개체입니다.알림()할 수 있습 프로그래머를 수동으로 구현을 차단합니다.스레드 해제 한 번에게 통지가 전송되는 조건을 충족하고있다.예:읽기 전에 디스크가 완료되면과 데이터를 처리할 수 있습니다.스레드가 있습니다.잠()에 필요한 프로그래머는 폴링을 경우에는 조건이 충족되었음을 다시 잠을 경우 그것은 하지 않았습니다.

다른 팁

이미 여기에 많은 좋은 답변이 있습니다. 그러나 여기에서 다른 사람이 Wait ()를 사용할 때해야 할 때해야한다고 언급하고 싶다.

다른 스레드가 조건을 true로 변경하고 알리는 것을 기다리려면 다음과 같습니다.

synchronized(o) {
  while(! checkCondition()) {
    o.wait();
  }
}

물론 요즘에는 새로운 조건 객체를 더 명확하고 더 많은 기능을 갖기 때문에 (잠금 당 여러 조건을 허용하고, 대기 대기 길이,보다 유연한 일정/인터럽트 등을 확인할 수있는 등)를 사용하는 것이 좋습니다.

 Lock lock = new ReentrantLock();
 Condition condition = lock.newCondition();
 lock.lock();
 try {
   while (! checkCondition()) {
     condition.await();
   }
 } finally {
   lock.unlock();
 }

}

Waite ()의 목적은 모니터를 해제하고 다른 스레드가 자신의 처리를 수행하기 위해 모니터를 얻도록하는 것이기 때문에 모니터를 소유해야합니다. 이러한 방법 (대기/알림)의 목적은 서로의 기능을 수행 해야하는 두 스레드 사이의 동기화 된 코드 블록에 대한 액세스를 조정하는 것입니다. 단순히 데이터 구조에 대한 액세스가 ScresdSafe인지 확인하는 것이 아니라 여러 스레드 간의 이벤트를 조정하는 문제입니다.

전형적인 예는 한 스레드가 데이터를 큐로 밀고 다른 스레드가 데이터를 소비하는 생산자/소비자 사례입니다. 소비 스레드는 항상 모니터가 큐에 액세스해야하지만 큐가 비어 있으면 모니터를 해제합니다. 그런 다음 생산자 스레드는 소비자가 더 이상 처리하지 않을 때 스레드에 글을 쓰는 데 액세스 할 수 있습니다. 더 많은 데이터를 큐에 밀어 넣은 후에는 소비자 스레드에 알리므로 모니터를 되찾고 큐에 다시 액세스 할 수 있습니다.

대기까지 제공합니터,그래서 당신은 그것을해야합니다.통지해야 합니터뿐만 아니라.

주된 이유할 수 있는지 확인하 모니터링을 때 당신은 돌에서 wait()--일반적으로,당신은 당신을 사용하여 기대/알려 프로토콜 일부를 보호하기 위해 공유 자원을하고 당신이 그것을 안전하는 터치 기다릴 때 그것을 반환합니다.이와 같은 통보--일반적으로 당신이 뭔가를 변경하고 다음을 호출하는 통보()--기를 원하신다면 모니터링,변경,그리고 전화를 알리().

만약 당신이 만든 기능 다음과 같다:

public void synchWait() {
   syncronized { wait(); }
}

당신이하지 않았 모니터 반환한다-당신을 얻을 수 있지만,그것을 얻지 못할 수도 있습니다.

제한이 실제로 필요한 이유에 대한 나의 이해는 다음과 같습니다. 나는 이것을 C ++ 모니터 구현에 기반을두고있다.

안에 MUTEX+Condition_Variable = 모니터 시스템, 기다리다 호출 조건 변수를 대기 상태로 설정하고 뮤트를 출시합니다. 조건 변수는 공유 상태이므로 대기하려는 스레드와 알림을 원하는 스레드 사이의 경주 조건을 피하기 위해 잠겨 있어야합니다. 상태를 잠그기 위해 또 다른 뮤텍스를 도입하는 대신 기존 뮤텍스가 사용됩니다. Java에서는 Ate-to-To-to-To-to-To-To-To-To-To-To To Wait 스레드가 모니터를 소유 할 때 MUTEX가 올바르게 잠겨 있습니다.

대기열이 비어 있다고 말하면 대부분 대기가 완료됩니다.

If(queue is empty)
     queue.wait();

대기열이 비어 있다고 가정합시다. 현재 스레드가 큐를 확인한 후 선점하는 경우 다른 스레드가 큐에 요소가 거의 추가되면 현재 스레드는 알지 못하고 대기 상태로 이동합니다. 그건 틀렸어요. 그래서 우리는 같은 것을 가져야합니다

Synchornized(queue)
{
   if(queue is empty)
          queue.wait();
}

이제 그들이 동기화 된대로 대기한다면 무엇을 고려해 봅시다. 의견 중 하나에서 이미 언급했듯이 하나의 잠금 만 공개합니다. 즉, 위의 코드에서 대기 ()가 동기화 된 경우 하나의 잠금 만 해제되었을 것입니다. 현재 스레드는 대기열의 잠금 장치와 대기하기 위해 이동한다는 것을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top