2015-08-15 92 views
5

在Thinking in Java中写道Thread.interrupt()不能中断试图获取同步锁的线程,我想知道为什么?为什么Thread.interrupt()不能中断试图获取锁的线程

+3

它可以中断线程。例如,线程在中断时不会停止等待同步锁定,因为它会(如通过抛出InterruptedException)休眠。但是如果线程获得了锁,那么检查它是否中断,它会是。 –

+0

在一个设计良好的程序中,没有线程永远持有锁的时间超过检查和更新一些变量所需的时间。应该不需要中断来“唤醒”待处理的同步块。如果你认为我错了,并且你的程序真的需要这个能力,那么考虑使用'java.util.concurrent.locks.ReentrantLock'而不是'synchronized'。 'reentrantLock.tryLock(time,unit)'方法_can_可以被中断。 –

回答

6

阻塞操作只有在声明为抛出InterruptedException时才会中断。显然,​​块没有声明它,因此在等待获取锁的时候不可能中断一个线程。

或者,您可以使用明确的锁定并致电Lock.lockInterruptibly()

1

这本书是错误的,除非它仅指​​关键字。 Object.wait()投掷InterruptedException

+0

我看了这本书的中文版,有几个错误,但我觉得这个地方是对的。这可能是我的表达不清楚导致你的误解 – wanghao

+0

@王浩,如果你想掌握并发性,那么我会强烈推荐“Java并发实践(Brian Goetz)”。 – Ruslan

+0

@wanhao'Object.wait()'抛出'InterruptedException'。没有什么可以误解的。如果这本书不同意,根据定义它是错误的。如果它只是在讨论'synchronized'关键字,那么你并没有这么说。如果您有*理由*认为该书是正确的,并且我误解了某些内容,请提供。 – EJP

相关问题