当通过停放线程暂停线程执行时,它是否会导致线程放弃任何获取的对象监视器的所有权?
简单地说,如果一个线程(t1)获取了这个'这个'对象并停在另一个线程(t2),试图取消停放t1,首先尝试获取'这个'和阻止。
// Thread t1 executes this code first.
syncronized(this) {
LockSupport.park();
}
// Thread t2 then executes this piece of code.
synchronized(this) {
LockSupport.unpark(t1);
}
答案 0 :(得分:2)
由于t1
被阻止,并且当this
尝试获取相同锁定时仍然拥有对t2
对象的锁定,因此会出现死锁。
答案 1 :(得分:0)
这没有任何意义。
有时一个线程一次需要持有多个锁。一些可怕的遗留代码可能会做这样的事情:
SELECT r.reservation_number, b.created_date_time, r.rate_type, r.room_type_code, r.room_code, t.client_code, (room_revenue + package_revenue + other_charge_revenue + spa_revenue) AS revenue_total
FROM nw_src.dbo.fdresrev r
JOIN nw_src.dbo.fdres_ta_c t ON r.reservation_number = t.reservation_number
JOIN nw_src.dbo.fdroomresc b ON r.reservation_number = b.reservation_number
ORDER BY r.reservation_number
如果synchronized(objectA) {
lockB.lock();
try {
doSomethingThatRequiresOwnershipOfBothLocks();
} finally {
lockB.unlock();
}
}
暂时解锁对象A上的监视器,则无法解决任何问题。