多线程下遇到空指针NullPointerException,下标越界ArrayIndexOutOfBoundsException 问题及解决办法

项目中遇到的问题。

1。多线程下偶尔会报 空指针NullPointerException异常。开始的时候怎么也想不明白为啥会报空指针,看代码每一步的数据我都有添加,怎么会集合有空指针呢?关键是控制台打印报错信息就只有这一个  NullPointerException异常。

2。后来一步步拆解,追踪打印每一步数据。发现了新的报错:下标越界ArrayIndexOutOfBoundsException 。

???

为啥又会是下标越界?难道我集合添加数据还会下标越界? new ArrayList<>()  不是可变长度吗?咋地越的界?

然后问度娘.....

参考:https://www.2cto.com/kf/201707/657089.html        ArrayList在多线程调用Add()添加元素时的下标越界问题!

好吧! 多线程!多线程!多线程! 这是在多线程下,ArrayList是线程不安全的。

3。解决办法:不安全的那就找个安全的集合呗。

参考:https://ask.csdn.net/questions/694685      多线程处理list;代码如何能保证list安全  

回答的方案:我用的是List list = new Vector();

要想保证线程安全我觉得有三种方式,第一种最常见到的是使用List list = new Vector(); 因为它本身就是线程安全的,只不过效率上要比ArrayList差点

第二种就是使用synchronized,上面已有回答,但是我觉得还是Vector简单点。

第三种是使用读写锁,ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
rwLock.writeLock().lock();
rwLock.writeLock().unlock();
rwLock.readLock().lock();
rwLock.readLock().unlock();

需要注意的是每次用完锁都记得释放,否则会发生死锁。

 

以上是我在多线程中遇到的坑,希望能够帮助到大家!

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值