2011-12-29 55 views
6

在着名的實踐中的Java Concurrency第2.4節中,它指出內部鎖定方法與顯式鎖定不同是一個糟糕的設計決策,因爲它的混淆和「......它迫使JVM實現者在對象大小和鎖定之間進行權衡性能。」 有人可以解釋如何對象大小影響鎖定性能?Java中的對象大小和鎖定性能之間是否存在關係?

+1

與'synchronized'類型的鎖應該沒有關係(從我的實現經驗來看),並且從簡要回顧Java 5鎖定方案,我不會直接看到那裏可能存在依賴關係。當然,它實際上需要更多的存儲空間來實現單獨的'Lock'對象,但這應該是一個固定的開銷。 – 2011-12-29 16:02:47

+0

@HotLicks多數民衆贊成在我感到驚訝,大小shudnt有任何額外的開銷,謝謝! – meer 2011-12-30 11:22:57

回答

5

那麼因爲每個對象都可以鎖定,這意味着每個對象都必須有足夠的位置來存儲鎖定時需要的所有信息。

這是相當沒有吸引力的,因爲絕大多數的物體永遠不會被鎖定,所以我們浪費了大量的空間。所以在實踐中,Hotspot通過使用2位來記錄對象的狀態並根據這兩位重用對象頭的其餘部分來解決這個問題。

然後是整個偏向/無偏向鎖定的東西..好吧,你可以開始閱讀關於它here。熱點文檔不是我所謂的擴展,但鎖定和對象頭文件比其他大多數代碼更好。但有疑問:閱讀源代碼。

PS:我們也有類似的問題,也是每個對象的本地哈希碼。如果你的GC洗牌的話,「只用內存地址」就不太好。 (但是與鎖定相反,如果我們需要此功能,則沒有真正的選擇)

+0

感謝您的信息,基本上它是關於所有原始同步,而不管用於鎖定的特定對象的大小 – meer 2011-12-30 11:23:59

+0

您是否有一些具體細節去處理這些語句? 「很多」的空間?鎖定時需要什麼信息? – Toby 2012-01-05 08:09:05

+0

@Toby至少是TID和遞歸計數器。有關詳細信息,您需要查看熱點源中的重鎖類。考慮到這被添加到每個對象,即使1-2個字也是「很多空間」。 – Voo 2012-01-05 20:43:23

2

最有效的鎖使用原生字大小,例如32位字段。但是,您不希望將4個字節添加到每個對象,而是使用AFAIK 1位,但設置此位比設置字大小更昂貴。

+0

即使我們使用字大小的字段,嗯,我們可以做到沒有CAS嗎?如果不是,它基本上只讀+位混洗+ CAS與CAS - 可能並不壞,但仍然較慢。 – Voo 2011-12-29 16:22:28

+0

@Voo在我的經驗中並不那麼糟糕,因爲'synchronized'可以通過JIT進行優化,方法是Lock不是。 – 2011-12-29 16:35:15

+0

我在談論同步實現。即使我們使用了一個字面化的鎖頭,我們仍然需要一個CAS來控制位混洗,所以在那裏沒有太大的區別。儘管我們可能正在談論對方。 – Voo 2011-12-29 16:49:30

相關問題