Benötigen Sie semaphore.relase () wenn semaphore.acquire () InterruptedException bekommt?

8

Aus der Java- java.util.concurrent.Semaphore-Dokumentation war mir nicht ganz klar, was passiert, wenn semaphore.acquire () den Thread blockiert und später durch eine InterruptedException unterbrochen wird. Wurde der Semaphor-Wert verringert, und muss der Semaphor freigegeben werden?

Gegenwärtig verwende ich Code wie folgt:

%Vor%

Oder sollte ich release () nicht aufrufen, wenn während acquire () eine InterruptedException auftritt?

    
kasimir 24.08.2012, 07:31
quelle

3 Antworten

8
  

call release () wenn eine InterruptedException während acquire () auftritt?

Das solltest du nicht. Wenn .acquire () unterbrochen wird, wird das Semaphor nicht erfasst, also sollte es wahrscheinlich nicht freigegeben werden.

Ihr Code sollte

sein %Vor%     
nos 24.08.2012, 07:48
quelle
3
Die angenommene Antwort von

nos ist teilweise korrekt, außer dass semaphore.acquire () auch InterruptedException auslöst. Um 100% korrekt zu sein, würde der Code folgendermaßen aussehen:

%Vor%     
jblack 21.02.2014 05:23
quelle
0

Wenn der Thread vor dem Aufruf der Methodenaufzeichnung unterbrochen wird oder während des Wartens auf die Erlangung einer Genehmigung, wird die InterruptedException ausgelöst, und es wird keine Genehmigung gespeichert, sodass keine Freigabe erforderlich ist. Nur wenn Sie sicher sind, dass eine Genehmigung erworben wurde (nach dem Aufruf der Methode acquire), müssen Sie die Genehmigung freigeben. Sie sollten also vor dem Start Ihres Blockes etwas lernen, etwa wie folgt:

%Vor%     
dan 24.08.2012 07:55
quelle