Java 中ArrayList的线程安全问题

猿问

Java 中ArrayList的线程安全问题

慕雪9262066 2018-07-15 10:09:17

有两个线程操作一个ArrayList 

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

B线程会执行

if(!list.isEmpty()){

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

}

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

 

4 回答

?交互式爱情

只有 @士别三日 @niniwei  说的才在点子上,@beyondforever68 的stackoverflow链接,因为我打不开网站,所以评论。其他人,一堆的妄语。

到底有没有搞清楚线程安全的含义和题主问的问题的关系,就不过脑的回答一堆歪理邪说,误人子弟,余毒他人!

首先,题主这个,只能通过加锁来解决,两段代码执行前,均需尝试获得同一对象锁。至于锁的方式,是用synchronize关键字,还是用某种lock对象,这些都是可行方案。当然,也可以使用其它的线程相关的工具类来解决。但核心还是,必须用锁机制!

至于什么线程安全的容器类来解决,简直是鬼扯,想都不要想!不懂线程安全的真实含义的,自己去百度去。

 

 反对 回复2018-07-15

?慕仙森

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

 反对 回复2018-07-15

?哆啦的时光机

arraylist本身是多线程不安全的,但是速度快

可以看这个文章:http://blog.csdn.net/sdefzhpk/article/details/7310499

 

 反对 回复2018-07-15

?Qyouu

Vector的大部分方法都是同步的,且与ArrayList几乎使用了相同的算法。性能也相差无几。建议使用Vector替代ArrayList

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值