2015-08-15 4 views
5

In dem Buch Denken in Java wird geschrieben, dass Thread.interrupt() einen Thread nicht unterbrechen kann, der versucht, eine synchronisierte Sperre zu erwerben, möchte ich wissen, warum?Warum kann Thread.interrupt() einen Thread nicht unterbrechen, der versucht, Sperre anzunehmen

+3

Es kann den Thread unterbrechen. Der Thread hört einfach nicht auf, auf die synchronisierte Sperre zu warten, wenn sie unterbrochen wird, wie beispielsweise (wenn eine InterruptedException ausgelöst wird), wenn sie beispielsweise schläft. Aber wenn der Thread die Sperre erhält, dann prüfe, ob es unterbrochen ist, wird es sein. –

+0

In einem gut entworfenen Programm würde kein Thread jemals eine Sperre länger halten, als es dauert, um einige Variablen zu untersuchen und zu aktualisieren. Es sollte kein Interrupt erforderlich sein, um einen ausstehenden "synchronisierten" Block aufzuwecken. Wenn Sie denken, dass ich falsch liege und Ihr Programm diese Fähigkeit wirklich benötigt, dann sollten Sie 'java.util.concurrent.locks.ReentrantLock' verwenden, anstatt' synchronized' zu verwenden. Die Methode 'reentrantLock.tryLock (time, unit)' _kann unterbrochen werden. –

Antwort

6

Ein Blockiervorgang kann nur unterbrochen werden, wenn InterruptedException ausgelöst wird. Ein synchronized Block deklariert dies natürlich nicht, daher ist es unmöglich, einen Thread zu unterbrechen, während er darauf wartet, eine Sperre zu erhalten. Alternativ können Sie eine explizite Sperre verwenden und Lock.lockInterruptibly() anrufen.

1

Das Buch ist falsch, es sei denn, es bezieht sich nur auf das Schlüsselwort synchronized. Object.wait() wirft InterruptedException.

+0

Ich lese die chinesische Version des Buches, es gibt ein paar Fehler, aber ich denke, dieser Ort ist richtig. Dies kann sein Ausdruck ist nicht klar, weil Ihr Missverständnis – wanghao

+0

@ Wanghao, wenn Sie Nebenläufigkeit dann würde ich stark empfehlen "Java Concurrency in der Praxis (Brian Goetz)". – Ruslan

+0

@wanhao 'Object.wait()' wirft 'InterruptedException'. Da gibt es nichts zu missverstehen. Wenn das Buch nicht übereinstimmt, ist es per Definition falsch. Wenn es nur um das synchronisierte Keyword geht, haben Sie das nicht gesagt. Wenn Sie einen Grund haben zu glauben, dass das Buch richtig ist und ich etwas falsch verstanden habe, geben Sie es bitte an. – EJP

Verwandte Themen