停放JAVA线程是否会导致任何获取的监视器被释放

时间:2017-03-23 00:02:07

标签: java multithreading concurrency deadlock java.util.concurrent

当通过停放线程暂停线程执行时,它是否会导致线程放弃任何获取的对象监视器的所有权?

简单地说,如果一个线程(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);
}

2 个答案:

答案 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上的监视器,则无法解决任何问题。