2010-09-24 19 views
1

是否有可能編寫一個類,使其他程序員無法獲取該類的實例的鎖定?防止程序員獲取對類實例的鎖

鎖定濫用,如果有這樣的術語,可能是一個嚴重的殺手。不幸的是,編程人員在提供線程安全代碼和有限併發知識的災難性力量之間徘徊,即使在調用實際上不需要實例資源被阻止的操作時也可能採用鎖定實例的方法造成嚴重破壞

+0

這個問題不太清楚。 「其他程序員」是什麼意思?你的代碼庫被拆分成一些無法訪問的塊嗎? – Bozho 2010-09-24 10:21:21

+0

其他程序員=那些會使用我開發的庫和/或代碼庫的維護人員,他們需要與我編寫的類 – anirvan 2010-09-24 10:45:22

回答

6

做到這一點的唯一方法是確保類實例不可見。例如,您可以聲明爲私有嵌套類,並確保封閉類不泄漏引用實例。

基本上,如果事情可以得到一個實例的引用的保持,有什麼可鎖定它停止它。

通常情況下,它足以保證參考鎖定對象不漏...而不是擔心類的可視性。

跟進 - 響應OP的意見。

您無法阻止其他人的代碼將您的某個類的實例作爲鎖。但是你可以設計你的類,這樣不會干擾你的類內部同步。只需安排您的班級使用私人對象(即使是Object實例)進行同步。

在更一般的意義上,你不能從你不喜歡的方式使用你的類停止應用程序的程序員。我聽說過的其他例子(這裏)包括試圖迫使人們重寫方法或提供特定的構造函數。即使將你的類字段私有化也不會阻止確定的(或絕望的)程序員使用反射來獲得它們。

但翻蓋面是,那些你正在試圖阻止事情實際上可能不會畢竟愚蠢。例如,可能實際上是應用程序將類用作鎖對象的合理原因,儘管您反對它會降低併發性。 (一般情況下,它的確如此,這只是在特定情況下這可能不相關)。

我的一般感覺是記錄您的課程設計用於設計的方式,以及設計API來鼓勵這一點。但試圖強制這個問題是不明智的。最終,對你的班級進行編碼的人有責任合理使用它們,而不是你的。

+0

一起工作,而我相信你的迴應是最合適的,我猜它只是點到類實例不能被鎖定保護的事實。類 - ConcurrentHashMap - 可能突出了我的困境。儘管它具有高度複雜的併發處理能力,但有人可能只是同步它的實例並撤銷所有優化。在這方面,我猜想命名類包括'併發'也是一個好策略:] – anirvan 2010-09-24 10:51:19

+0

在ConcurrectHashMap上同步隻影響在其上同步的代碼。任何人通常都會不會受到影響。 – 2010-09-24 15:56:02

0

如果一個類的成員需要保護併發訪問,則應該在內部完成鎖定。否則,你迫使那些使用它的人瞭解它的實現細節,當他們不應該能夠看到它的接口時。

0

當創建一個新的實例,還可以創建一個新的線程,其立即進行同步的實例,並進入睡眠狀態(使用Thread.sleep()方法)。任何試圖在實例上同步的代碼都會死鎖,因此開發人員不得不重新考慮他的方法。

免責聲明: 不要投我這麼做,因爲我的建議是瘋了。我知道它是。我只是回答這個問題。不要這樣做!