高併發下實現執行緒安全的i 操作

2021-10-21 07:30:16 字數 2485 閱讀 1089

這個比較簡單,就是在進行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...