HashMap是執行緒安全的嗎?

2021-10-06 11:16:22 字數 385 閱讀 5890

答,不是。雜湊碰撞或擴容導致。還有兩處可能不安全:在擴容的時候插入資料,有可能會把新插入的覆蓋住;在擴容的時候刪除資料,會刪除不了。

如果我在擴容時,在資料從舊陣列複製到新陣列過程中,這時候某個執行緒插入一條資料,這時候是插入到新陣列中,但是在資料複製過程中,hashmap是沒有檢查新陣列上的位置是否為空,所以新插入的資料會被後面從舊陣列中複製過來的資料覆蓋住。

如果在(2)剛執行後,某個執行緒就立刻想刪除以前插入的某個元素,你會發現刪除不了,因為table指向了新陣列,而這時候新陣列還沒有資料。

解決:加同步鎖。 要注意用讀寫鎖,即:多個執行緒可以同時讀,但只有乙個執行緒可同寫。不然資料量大的時候也會影響效能。

i 是執行緒安全的嗎?

i 不是原子操作,也就是說,它不是單獨一條指令,而是3條指令 3條彙編指令 1 從記憶體中把i的值取出來放到cpu的暫存器中 2 cpu暫存器的值 1 3 把cpu暫存器的值寫回記憶體 由於執行緒共享棧區,不共享堆區和全域性區,所以當且僅當 i 位於棧上是安全的,反之不安全 i也同理 因為如果是全域...

Servlet是執行緒安全的嗎?

servlet不是執行緒安全的。要解釋為什麼servlet為什麼不是執行緒安全的,需要了解servlet容器 即tomcat 使如何響應http請求的。當tomcat接收到client的http請求時,tomcat從執行緒池中取出乙個執行緒,之後找到該請求對應的servlet物件並進行初始化,之後呼...

servlet是執行緒安全的嗎

servlet 預設是單例模式,在web 容器中只建立乙個例項,所以多個執行緒同時訪問servlet的時候,servlet是執行緒不安全的。那麼 web 容器能為每個請求建立乙個servlet的例項 增加了系統的消耗 嗎?當然是可以的,只要servlet實現singlethreadmodel介面,就...