同步類容器都是執行緒安全的,但是在某些場景下可能需要加鎖來保護復合操作。復合操作如:迭代(反覆訪問元素,遍歷容器中所有的元素)、跳轉(根據指定的順序找到當前元素的下乙個元素)、以及條件運算。這個復合操作在多執行緒併發地修改容器的時候,可能表現出意外的行為,最為經典的便是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()
;}}}
示例2:使用vector演示,沒有有執行緒安全問題執行緒1-->火車票0
執行緒9-->火車票6
執行緒8-->火車票0
執行緒3-->火車票0
執行緒4-->火車票6
執行緒7-->火車票4
執行緒0-->火車票0
執行緒6-->火車票4
執行緒2-->火車票6
執行緒5-->火車票6
......
執行結果/**
* 使用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()
;}}}
示例3:使用hashmap演示,有執行緒安全問題執行緒5-->火車票1
執行緒1-->火車票5
執行緒3-->火車票6
執行緒4-->火車票3
執行緒0-->火車票4
執行緒2-->火車票2
執行緒10-->火車票0
執行緒7-->火車票7
執行緒8-->火車票8
執行緒9-->火車票10
執行緒6-->火車票9
執行緒1-->火車票11
.......
執行結果/**
* 使用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:使用hashtable演示,沒有執行緒安全問題執行緒3-->火車票0
執行緒2-->null
執行緒7-->null
執行緒0-->火車票0
執行緒10-->null
執行緒9-->null
執行緒4-->null
執行緒8-->null
執行緒1-->null
執行緒5-->火車票0
執行緒6-->火車票0
......
執行結果/**
* 使用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 等工廠方法建立的。但在某些場景下可能需要加鎖來保護復合操作...