1、併發測試,會出現的賦值成功,但是結果卻是數量少了。
new thread(new runnable()
}},"aaa").start();
new thread(new runnable()
}},"bbb").start();;
new thread(new runnable()
}},"ccc").start();;
set> entryset = map.entryset(); // 怎麼做到返回所有的對映關係
try catch (interruptedexception e)
int size = entryset.size();
system.out.println(size); // 對映的數目才是hashmap的存放的鍵值對
// 列印結果,會出現size小於3000的情況。
hashmap就是共享資源
分析:多執行緒訪問,在建立entry時候,拿到的entrye = table[i] ,那麼再new entry的時候就會後乙個執行緒覆蓋上乙個執行緒的值。
(原理:多個執行緒同時發生碰撞的時候,且都在陣列的同乙個位置時。同時對鍊錶的頭部更新操作,出現值被覆蓋)
void createentry(int hash, k key, v value, int bucketindex)
2、執行緒不安全造成環狀鍊錶分析
void transfer(entry newtable, boolean rehash)
int i =
indexfor(e.hash, newcapacity
);//
計算下標
e.next = newtable[i
];//newtable[i]的值賦
給e.next (
第一次table[i]
是null值)
newtable[i] =
e;//再把e
賦給newtable[i]
每次迴圈都是將新來的
e指向已經存在的物件
newtable[i]
處的鍊錶,再將此鍊錶賦給
newtable[i]
。這樣做和
put原理一樣,複雜度是
o(1)
。e = next;}
HashMap在1 7 1 8中的執行緒安全問題
在jdk1.7中,當併發執行擴容操作時會造成環形鏈和資料丟失的情況。資料丟失 在jdk1.8中,在併發執行put操作時會發生資料覆蓋的情況。1 執行緒安全 兩者最主要的區別在於hashtable是執行緒安全,而hashmap則非執行緒安全。hashtable的實現方法裡面都新增了synchroniz...
執行緒安全問題
執行緒安全問題導致的原因 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒有徹底執行完畢,此時另乙個執行緒參與進來執行,導致共享資料的錯誤。執行緒安全解決辦法 對多條操作共享的語句,每次只能讓乙個執行緒執行完成。在執行的過程中,其他執行緒不可以參與執行。解決方案 同步...
執行緒安全問題
是指 在多個執行緒進行的情況下對全域性變數或靜態變數進行寫的操作的時候出現的資料上的問題,就是執行緒安全的問題,在讀的時候不會出現執行緒的問題 即 public void run catch interruptedexception e synchronized this 即 package com...