虽然我知道 Re-EntrantLocks 和 之间的理论差异synchronized
,但我对以下几点感到困惑。
synchronized
请参阅有关 Javarevisited 比较和Lock
对象的文章中的此声明:
ReentrantLock 和 Java 中的 synchronized 关键字之间另一个值得注意的区别是,在等待 Lock 时可以中断 Thread。在 synchronized 关键字的情况下,线程可以无限期地阻塞等待锁定,并且无法控制。ReentrantLock 提供了一个名为 lockInterruptibly() 的方法,可以用来在线程等待锁时中断线程。类似地,如果锁定在特定时间段内不可用,可以使用带有超时的 tryLock() 来超时。
根据上面的陈述,我确实尝试在同步方法(即阻塞等待)上中断线程等待(),它确实抛出了一个 InterruptedException。但这种行为与上述陈述中的说法相矛盾。
// this method is called from inside run() method of every thread.
public synchronized int getCount() {
count++;
try {
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + " gets " + count);
} catch (InterruptedException e) {
e.printStackTrace();
}
return count;
}
....
....
t1.start();
t2.start();
t3.start();
t4.start();
t2.interrupt();
这是我得到的输出:
Thread 1 gets 1
Thread 4 gets 2
Thread 3 gets 3
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at locks.SynchronizedLockInterrupt.getCount(SynchronizedLockInterrupt.java:10)
at locks.SynchronizedLockInterrupt$2.run(SynchronizedLockInterrupt.java:35)
at java.lang.Thread.run(Unknown Source)
如果我的示例不正确或引用的有关 synchronized() 的陈述不正确,我会感到困惑?