併發程式設計高階01 同步類容器

2021-09-12 08:01:23 字數 3499 閱讀 8168

同步類容器都是執行緒安全的,但是在某些場景下可能需要加鎖來保護復合操作。復合操作如:迭代(反覆訪問元素,遍歷容器中所有的元素)、跳轉(根據指定的順序找到當前元素的下乙個元素)、以及條件運算。這個復合操作在多執行緒併發地修改容器的時候,可能表現出意外的行為,最為經典的便是concurrentmodifationexception,原因是當容器迭代的過程中,被併發地修改了容器的內容,這是由於在早起迭代器設計的時候並沒有考慮併發修改的問題。

同步類容器:最為古老的vector、hashtable。這些容器的同步功能其實都是jdk的collections.synchronized****等工廠方法去建立實現的。其底層的機制無非就是用傳統的synchronized關鍵字對每個公用的方法都進行同步,使得每次只能有乙個執行緒去訪問容器的狀態、這很明顯不滿足我們今天網際網路時代的高併發需求,在保證執行緒安全的時候,也必須要求足夠好的效能。

示例1:使用arraylist演示,有執行緒安全問題

/**

* 使用arraylist(簡單執行緒同步問題)

* @author bruceliu

* @create 2019-03-10 13:04

*/public

class

vectortest

for(

int i =

0; i<=

10; i++

)else

catch

(interruptedexception e)

system.out.

println

(thread.

currentthread()

.getname()

+"-->"

+tickets.

remove(0

));}

}}}.

start()

;}}}

執行結果

執行緒1-->火車票0

執行緒9-->火車票6

執行緒8-->火車票0

執行緒3-->火車票0

執行緒4-->火車票6

執行緒7-->火車票4

執行緒0-->火車票0

執行緒6-->火車票4

執行緒2-->火車票6

執行緒5-->火車票6

......

示例2:使用vector演示,沒有有執行緒安全問題

/**

* 使用vector(簡單執行緒同步問題)

* @author bruceliu

* @create 2019-03-10 13:04

*/public

class

vectortest

for(

int i =

0; i<=

10; i++

)else

catch

(interruptedexception e)

system.out.

println

(thread.

currentthread()

.getname()

+"-->"

+tickets.

remove(0

));}

}}}.

start()

;}}}

執行結果

執行緒5-->火車票1

執行緒1-->火車票5

執行緒3-->火車票6

執行緒4-->火車票3

執行緒0-->火車票4

執行緒2-->火車票2

執行緒10-->火車票0

執行緒7-->火車票7

執行緒8-->火車票8

執行緒9-->火車票10

執行緒6-->火車票9

執行緒1-->火車票11

.......

示例3:使用hashmap演示,有執行緒安全問題

/**

* 使用hashmap簡單執行緒同步問題

* * @author bruceliu

* @create 2019-03-10 13:04

*/public

class

vectortest

for(

int i =

0; i <=

10; i++

)else

catch

(interruptedexception e)

system.out.

println

(thread.

currentthread()

.getname()

+"-->"

+ tickets.

remove(0

));}

}}}.

start()

;}}}

執行結果

執行緒3-->火車票0

執行緒2-->null

執行緒7-->null

執行緒0-->火車票0

執行緒10-->null

執行緒9-->null

執行緒4-->null

執行緒8-->null

執行緒1-->null

執行緒5-->火車票0

執行緒6-->火車票0

......

示例3:使用hashtable演示,沒有執行緒安全問題

/**

* 使用hashmap簡單執行緒同步問題

* * @author bruceliu

* @create 2019-03-10 13:04

*/public

class

vectortest

for(

int i =

0; i <=

10; i++

)else

catch

(interruptedexception e)

system.out.

println

(thread.

currentthread()

.getname()

+"-->"

+ tickets.

remove(0

));}

}}}.

start()

;}}}

執行結果

執行緒1-->火車票0

執行緒0-->null

執行緒3-->null

執行緒2-->null

執行緒6-->null

執行緒8-->null

執行緒9-->null

執行緒10-->null

執行緒4-->null

......

同步類容器和併發類容器

同步類容器都是執行緒安全的,但是某些場景下可能需要加鎖來保護復合操作。復合類操作如 迭代 反覆訪問元素,遍歷完容器中所有的元素 跳轉 根據指定的順序找到當前元素的下乙個元素 以及條件運算。這些復合操作在多執行緒併發地修改容器時,可能會表現出意外的行為,最經典的便是concurrentmodifica...

同步類容器和併發類容器

同步類容器都是執行緒安全的,但在某些場景下可能需要加鎖來保護復合操作。復合類操作。如 迭代 反覆訪問元素,遍歷完容器中所有的元素 跳轉 根據指定的順序找到當前元素的下乙個元素 以及條件運算。這些復合操作在多執行緒併發地修改容器時,可能會表現出意外的行為,最經典的便是concurrentmodific...

同步類容器和併發類容器

同步類容器都是執行緒安全的,同步容器類包括 vector 和 hashtable,二者都是早期 jdk 的一部分,此外還包括在 jdk1.2 當中新增的一些功能相似的類,這些同步的封裝類是由 collections.synchronized 等工廠方法建立的。但在某些場景下可能需要加鎖來保護復合操作...