這個比較簡單,就是在進行i++操作時,直接使用synchronized加鎖,也可以使用lock加鎖,本質都是一樣的(鎖原理不同),最終都是通過加鎖來保證多執行緒安全的。
public
class
synchronized_add
public
static
void
main
(string[
] args)
throws interruptedexception
catch
(interruptedexception e)
for(
int n =
0; n <
1000000
; n++)}
);}for
(int i =
0; i < threads.length; i++
)for
(int i =
0; i < threads.length; i++
) system.out.
println
(v.i)
; system.out.
println
("耗時: "
+(system.
currenttimemillis()
- start)
+"ms");
}}
耗時: 4568ms
public
class
atomicinteger_add})
;}for(
int i =
0; i < threads.length; i++
)for
(int i =
0; i < threads.length; i++
) system.out.
println
(ai.
get())
; system.out.
println
("耗時: "
+(system.
currenttimemillis()
- start)
+"ms");
}}
耗時: 2657ms
這個類是jdk8版本新增加的,支援原子操作。與atomicinteger不同的是,它內部採用的分段鎖。
public
class
longadder_add})
;}for(
int i =
0; i < threads.length; i++
)for
(int i =
0; i < threads.length; i++
) system.out.
println
(longadder.
sum())
; system.out.
println
("耗時: "
+(system.
currenttimemillis()
- start)
+"ms");
}}
耗時: 706ms
這個類是jdk9版本新增加的。varhandle是檔案控制代碼,內部提供了多個原子操作的方法。
ppublic class
varhandle_add
catch
(nosuchfieldexception
| illegalacces***ception e)
}public
static
void
add(varhandle_add v)
public
static
void
main
(string[
] args)
throws interruptedexception })
;}for(
int i =
0; i < threads.length; i++
)for
(int i =
0; i < threads.length; i++
) system.out.
println
(ihandle.
get(v));
system.out.
println
("耗時: "
+(system.
currenttimemillis()
- start)
+"ms");
}}
耗時: 4762ms
以上耗時統計都是基於同一臺電腦,只是乙個對比參考,實際數值沒有意義。只是在這種場景下,100個執行緒,每個執行緒執行100w次i++操作。
高併發下列舉單例執行緒安全?
先說結果,不是安全的 展示下列舉單例 package com.self.entity public enum logsingleton public logsingleton add override public string tostring 然後是呼叫方法 package com.self.t...
高併發下的HashMap
1.hashmap在插入元素過多的時候需要進行resize,resize的條件是 hashmap.size capacity loadfactor。2.hashmap的resize包含擴容和rehash兩個步驟,rehash在併發的情況下可能會形成鍊錶環 hashmap進行儲存時,假設size超過當...
高併發下的MySQL
對於遊戲來說,db存在大量的insert update 可謂玩家的很多動作都會與db溝通。本文暫時忽略os 中的 io利用率,網絡卡流量,cpu變化情況,介紹如何檢視mysql部分引數 檢視每秒事務數 show global status like com commit show global st...