2017-04-03 49 views
1

ThreadLocal可以用作HashMap中的鍵嗎?ThreadLocal可以用作HashMap中的鍵嗎?

如果是這樣,它是如何工作的,它通常是一個壞主意?我應該注意並注意什麼?

+0

這聽起來像一個非常糟糕的主意。 ''ThreadLocal'實例並不意味着被這樣使用,很大程度上取決於它的'equals'方法,它可能會根據哪個線程調用它而給出不同的結果。你爲什麼不使用'ThreadLocal'持有的值? –

+0

這個問題很奇怪。一方面,這是一個奇怪的想法。另一方面,這真是太古怪了,我真的開始思考這個問題。不幸的是,這不是應該在這裏提出的問題。請參閱:http://stackoverflow.com/help/on-topic和http://stackoverflow.com/help/dont-ask –

+4

快速瀏覽後,我發現'ThreadLocal'沒有實現'equals'和'hashCode'方法。所以它不會工作。 –

回答

3

您可以使用ThreadLocal作爲像任何其他對象一樣的HashMap鍵。它是否有任何意義是一個不同的話題。

基本上你可以有問題,如果你使用了可變對象爲喜歡的事情HashMapHashSet等的關鍵,因爲這些類通常使用hashCode()(因此得名),把東西在水桶和檢索。因此,如果您使用可變對象作爲鍵,然後更改對象(以hashCode更改的方式),然後嘗試通過鍵檢索條目,則不會再找到條目,因爲映射將顯示在錯誤的存儲桶中入口。

ThreadLocal這種情況將不會是一個問題,因爲它沒有覆蓋equals()hashCode()因此如果您更改對象hashCode()不會改變,所以你可以安全使用ThreadLocal關鍵。

1

由於雅羅斯瓦夫帕夫拉克評論,因爲ThreadLocal沒有實現hashCode()equals()它是不適合在HashMap關鍵,至少如果你希望它是表現良好。

即使這樣做,也沒用。考慮到ThreadLocal的用例,使用包含的對象作爲密鑰會更加清楚。

映射與一個ThreadLocal(具有線程特定的內容)映射只是最終有內部映射ThreadLocal(映射線程值的值)被用於實際映射。

更不用說ThreadLocal實例有點被推薦。通過引入「本地」線程本地類,如java.util.concurrent.ThreadSafeRandom解決了它們的常見用例。

+1

一個對象的行爲有什麼問題,不重寫'hashCode'和'equals'?它只是一個基於身份的哈希映射。如果你使用同一個對象,這是完美的表現。 – RealSkeptic

+0

@RealSkeptic,所以我會說這個答案是錯誤的。:-) – Vampire

+0

因爲如果你想要'IdentityHashMap',你應該明確地使用它。使用帶有額外的'ThreadLocal' weirdery的常規'HashMap'只是不清楚編程。 – Kayaman

相關問題