Java執行緒面試題(01) Java中如何檢查一個執行緒是否擁特定物件的鎖
本文為本博主翻譯,未經允許,嚴禁轉載
簡介
考慮一個場景,在執行時你必須確認一個Java執行緒是否持有特定物件的鎖,例如,確認NewsReader執行緒是否持有NewsPaper物件的鎖?如果這個問題出現在任何核心的Java面試中,那麼我會自動假設可能有至少兩個答案,一個是難以獲得的原始答案,程式設計師想根據基本原理找出答案,而另一個可能是一些很少使用的Java API呼叫,順便說一下,這實際上是在接受我最大的全球投資銀行之一面試時是被問到的問題。投資銀行領域,特別是現金股票, 需要強大的核心Java和多執行緒技能來構建高效能,低延遲的Java應用程式,以處理每天數百萬個訂單。
2種方法來查詢執行緒是否持有Java物件的鎖
在這裡,我正在給出我的答案以及我在面試後發現的東西。是的,非常不幸,面試官在電話面試中詢問我時,我不知道答案。我設法提供了基於同步塊和wait()和notify()方法的屬性的邏輯,如第一個答案所示,但他當時並不滿意。
許多面試官期望得到他們認為最好的答案,他們會推動你繼續尋找直到你放棄,或者你給他們他們想要的答案。這在面試中非常常見。
1)我想過,當wait()和notify()方法從非同步上下文中呼叫時會丟擲IllegalMonitorStateException,所以我說我會呼叫newspaper.wait(),如果這個呼叫丟擲異常,這意味著Java中的執行緒並未持有鎖,否則執行緒持有鎖。
2)後來我發現執行緒有一個名為holdsLock(Object obj)的靜態方法,它根據執行緒是否對傳遞的物件持有鎖來返回true或false。
您還可以學習Cay S. Horstmann的Core Java Volume 1 - Fundamentals或Java Threads 2nd Editon,以瞭解更多關於Java中的Thread類的內容。第一本書是以最容易的方式學習Java祕密的最佳書籍之一。
這就是如何找到一個執行緒是否擁有Java中某個特定物件的鎖。如果您需要在Java應用程式中知道這一點,則應該使用java.lang.Thread類的holdsLock()方法。
意見,建議,創新更好的答案總是受歡迎的。