java 中的hashmap在多執行緒中是不安全的,開發中還經常用,是spring框架幫忙解決了嗎 ?

時間 2021-05-31 01:48:33

1樓:程式猿弟弟

「不安全」第一時間就會想到多執行緒吧。只有在多執行緒併發的情況下才會出現不安全的。我們在開發的過程中,乙個請求就是乙個執行緒。在乙個執行緒裡面做hashmap儲存是沒有問題的。

我覺得樓主提的問題應該是spring在使用單利bean物件是如何保證request執行緒的隔離。這樣問才有意義。

2樓:懸壺醉世

這個問題其實是乙個挺有意思的問題。。。

spring框架實際上是乙個大型的工廠模式。

那麼 spring中的HashMap安全麼?

首先執行緒安全問題出現的地方是:

多個執行緒同時操作乙個物件並沒有鎖死物件引發的問題。

所以引發這類問題必須考慮的是,物件是否單一,是否具備多執行緒訪問場景。

首先

正常情況下方法中new出來的HashMap是不大會有執行緒安全問題的,因為每乙個執行緒都建立了乙個HashMap

其次

最簡單的情況下就是static靜態hashMap。這類物件全域性靜態變數。同一變數多個例項呼叫的情況下會發生執行緒問題。

其次

你在某乙個執行緒下建立子執行緒thread對某個物件進行操作的時候會有執行緒安全問題。

最後

spring的Bean物件存在的HashMap是否有執行緒安全問題。這牽涉到spirng對於物件的管理模式。

singleton:預設的scope,每個scope為singleton的bean都會被定義為乙個單例物件,該物件的生命週期是與Spring IOC容器一致的(但在第一次被注入時才會建立)。prototype:

bean被定義為在每次注入時都會建立乙個新的物件。request:bean被定義為在每個HTTP請求中建立乙個單例物件,也就是說在單個請求中都會復用這乙個單例物件。

session:bean被定義為在乙個session的生命週期內建立乙個單例物件。websocket:

bean被定義為在websocket的生命週期中復用乙個單例物件。

不同的作用域有不同的物件復用情況。當然單例模式下物件復用最優秀,但是會引發執行緒安全問題。其他情況下有了不同的層級。可以根據效能與併發安全選擇適合自己的物件。

我想你指的常用是在方法體中經常new。這種方式並不會有執行緒安全問題。因為每個執行緒處理的都是不同的hashmap

3樓:雲端的曼徹斯特

是不安全的,但是開發過程中基本上你用到的hashmap程式設計的場景一般都是序列化執行的程式。不存在並行化的場景。

最常見存在併發的兩個場景:

1.tomcat後者其它中介軟體接收乙個新的session會話的時候會新建乙個執行緒。但是這個中介軟體已經幫你做了。

除非你在開發過程中自己寫多執行緒的場景要考慮執行緒安全。其它場景下框架和資料庫都已經幫你考慮進去了。

4樓:Intopass

執行緒不安全,你不要多執行緒訪問不就好了?確實需要多執行緒訪問的,有執行緒安全的版本。

為什麼不都用執行緒安全的版本?因為加鎖有開銷,不用考慮併發的時候就盡量不用咯。

5樓:黑狗

Spring是開發框架,資料安全JDK倒是幫你解決了。

Web開發業務邏輯處理一般不涉及多執行緒!

Web開發中用Hashmap,一般都是做Json物件,相當於把乙個類的屬性拆分到map的Key=>Value.

Servlet容器,處理Request請求,一般都是乙個請求對應乙個乙個執行緒,所以你在開發Web應用程式處理業務邏輯並沒有涉及到多執行緒,

看到最多的案例演示,不是在Spring中的!

你看到涉及到多執行緒處理最多的案例演示一般都是搶票啥的,開了多線執行緒,資料可以放到系統提供的併發容器裡(系統提供的安全類如ConcurrentHashMap),當然你也也可以自己加鎖實現

Web開發難道就沒多執行緒需求?

有的!你看秒殺,搶票,等已有很多替代實現的方案,如基於實現Zoookeeper,Redis分布式鎖。

6樓:塗飛平

為什麼是spring幫忙?開發不一定就需要引入spring吧?

hashmap不是執行緒安全,但我們編寫程式的大部分場合都是讀多寫少,對於讀取,hashmap時間複雜度是O(1),可以認為與資料規模無關(其實還是有點關係的)。

如果是多執行緒程式,並且寫入非常頻繁,就需要注意執行緒安全了。不過,回想自己編寫的系統,這種場合多嗎?並不多,即使有,只要不是全域性變數,也基本上可以不考慮併發的問題。

如果要加入現場安全考慮,效能上肯定不如hashmap,這是毋庸置疑的。

用什麼都是取捨的過程!

java中hashmap為什麼key的值不一樣呼叫hashcode的hash值為什麼相同?

Intopass 因為KEY的 容量 有可能超過雜湊值 int型別 的容量,你從乙個大範圍對映到小範圍必然不可能保證一對一,只能是多對一。 hashcode的目的是實現對若干物件分批次,key的值不一樣 意味著不同的key之間呼叫equals 方法返回false。hashcode分批次的目的是,把大...

為什麼java的hashmap不支援動態縮小容量?

Spongecaptain 這是乙個有意思的問題,可以從必要性得到解釋。試圖將一大堆 key value 對放入到乙個HashMap 中,我們目標就是乙個 HashMap,自然需要自動擴容機制。補充乙個外鏈,和我的說法有著類似的道理。 youngc 為了減少 hashmap 自動擴容次數,鼓勵在建立...

為什麼 HashMap 中的load factor在各個語言的實現中都在 0 6 0 8 之間?

乾貨滿滿張雜湊 首先,這個基於乙個假設,那麼就是當乙個事件發生的概率大於 0.5,那麼這件事就是很可能發生的。然後,假設當前有 s 個桶,那麼每次放入乙個元素進入某乙個桶的概率就是 放入了第 n 個元素,那麼,某乙個桶元素個數為e的概率,根據二項式分布就是 將e 0代入,得出 讓這個概率大於 0.5...