项目中遇到的问题。
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();
需要注意的是每次用完锁都记得释放,否则会发生死锁。
以上是我在多线程中遇到的坑,希望能够帮助到大家!