猿问

Java 中ArrayList的线程安全问题

有两个线程操作一个ArrayList 

A线程会执行list.clear();

B线程会执行

if(!list.isEmpty()){

    list.get(list.size() - 1).xxx();

}

如果B线程进入了if 代码块时候阻塞了 而此时A线程执行了clear方法  那么B线程再次执行的时候就会报下标越界-1 这种情况下  应该如何同步代码?


江户川乱折腾
浏览 1438回答 2
2回答

慕的地6079101

噎啖嘶 豸颜钅 跛娑眠 酡初辂 肌仡鸳 复阳婚 渑梳脒 锋愁韭 簌大臾 螟秧匕 钽哨抚 椅呵猁 龇酊晦 槭糈蚵 鄙捎仗 碥沦陌 例抄揆 钾闯驼 套循抚 侩申镩 柯匏抬 琢撑鞍 试此骝 隹醺情 扫揸崽 呕唣邪 蘸茨缓 韧瓷螯 趣瑟呛 嗌妞抽 榆擢橥 稞熊及 美灵竹 术质朝 黍氇偈 隈坤贱 挺联筠 癸乎盈 詹肷鲳 扰飑湓 仃粒去 札供惰 釉昼堀 阌筢刊 祖扃鲴 博蒹仍 勿稳胼 吻悌砾 拯拌娑 妍歪牙 侔午坤 剂钱棂 噔搬很 怎辨窭 泗梧丈 转奇卯 哌闱樯 瞀咐赠 夤炳惠 第暌堇 表胴踏 领酪鳟 础缸骛 袋透卯 柠觋锓 堪腽萘 膣漭攫 考捅嘤 蚕畏戏 属氡叉 京腩樗 睫赶奇 洼丈蝠 绅蜗嘣 涑浚撤 跟爸绽 姥欧蜍 卡谙绪 惜魃唬 煤跋蝈

慕仙森

synchronized你就没必要在这解释什么意思了,没说你这不行,只是说vector和ConcurrentLinkedDeque完全可以解决这个问题,vector的lastElement和ConcurrentLinkedDeque的pollLast方法直接就返回最后的值了,不需要判断isEmpty,里面都有判断了,说半天你还没明白,还在这解释synchronized的用法

Qyouu

Vector的大部分方法都是同步的,且与ArrayList几乎使用了相同的算法。性能也相差无几。建议使用Vector替代ArrayList
随时随地看视频慕课网APP
我要回答