问题描述

最近在做飞机大战游戏,发现一个问题,就是游戏运行了一定时间后会停止,同时eclipse会报出空指针异常。
为此,我针对性地在 遍历list列表并取出列表元素 的for循环中输出每个对象,发现确实会出现null值,且null值出现是随机的,因此我意识到应该不是代码问题(因为如果是代码问题,每次bug的位置、时间等条件应保持一致)。
但是由于我代码中有碰撞检测并移除子弹和敌机的操作,怀疑可能是由于移除导致list该位置元素为空,但还没来得及更新就被其他代码调用的情况,因此我为了确定问题根源,将移除的方法注释掉,发现仍然会出现空指针报错。

原因分析:

我后来通过百度搜索终于确定了问题根源:ArrayList
简单来说,ArrayList不适合多线程高并发的情况,会出现内部某些位置为null的情况。核心原因是,ArrayList的add的方法不是线程安全的,是非原子性的,add操作可以简单理解为两个步骤:

1.给索引位置赋值

2.size加1

如果现在有两个线程a,b,size为5,索引为4,a线程读到索引位值时,将值赋值到这个位置,这时cpu时间片让出,b线程读到的索引位置也是4,将size加1。这个时候a线程恢复cpu时间片,size加1。这样,索引位置值变成了a线程赋值的值,b线程的值被覆盖了,但是size却加了2次,这样取值的时候自然就取到了空值。

解决办法:

1.尽量避免在多线程的环境中使用ArrayList.

2.使用Collections.synchronizedList 方法包装list,它里面使用的是synchronized关键字来实现线程安全的。
List list = Collections.synchronizedList(newArrayList());

3.vector

4.CopyOnWriteArrayList(线程安全,基于copy思想,但是数据过多,可能导致gc频繁,需要衡量。)

参考博客:

:《高并发下ArrayList空值(null)问题》,作者:归海一刀之渔舟唱晚

ArrayList问题之高并发多线程环境下会出现内部成员会出现null相关推荐

  1. 面试高薪程序员之高频面试题(一),集合,JVM,高并发多线程等

    一,java集合类 Java集合比如说HashMap和ConcurrentHashMap,HashMap底层实现原理?HashMap加载因子为什么是0.75?HashMap扩容操作可能会出现的问题?H ...

  2. 多线程与高并发 笔记,非面向初学者 二:java引用,高并发多线程容器,线程池

    网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容 如果右边没有就找找左边 上一节:JUC锁,一些面试题和源码讲解 1.引用 java引用共4种,强软弱虚 强引用:我们普通的new一个对象,就 ...

  3. 推测的删除锁(Speculative Lock Elision):实现高并发多线程执行

    背景 SLE全称Speculative Lock Elision,我称之为推测的删除锁.这是一篇关于SLE的论文翻译,但是因为本人英语功底很差,所以翻译的不通顺而且会有很多错误的地方.之所以把它发出来 ...

  4. 多线程环境下HashMap导致CPU100%

    引言 昨天早上线上系统开始作业了一段时间以后,突然收到服务器报警,服务器CPU持续占用100%,导致线上系统不能正常使用,我登录服务器top了一下,发现java进程占用cpu400%, 由于前天晚上上 ...

  5. HttpClient在多线程环境下踩坑总结

    HttpClient在多线程环境下踩坑总结 问题现场 在多线程环境下使用HttpClient组件对某个HTTP服务发起请求,运行一段时间之后发现客户端主机CPU利用率呈现出下降趋势,而不是一个稳定的状 ...

  6. Java多线程之单例模式在多线程环境下的安全问题

    Java多线程之单例模式在多线程环境下的安全问题 目录: 单例模式基本概念 单线程下的单例模式 多线程下的单例模式 单例模式volatile分析 1. 单例模式基本概念 基本概念转载自:单例模式|菜鸟 ...

  7. 单例模式的5种实现方式,以及在多线程环境下5种创建单例模式的效率

    这段时间从头温习设计模式.记载下来,以便自己复习,也分享给大家. [java] view plaincopy package com.iter.devbox.singleton; /** * 饿汉式 ...

  8. 高并发多线程分片断点下载

    基于Java的高并发多线程分片断点下载 首先直接看测试情况: 单线程下载72MB文件 7线程并发分片下载72MB文件: 下载效率提高2-3倍,当然以上测试结果还和设备CPU核心数.网络带宽息息相关. ...

  9. 多线程环境下的线程不安全问题(1)

    在不考虑多线程的情况下,很多类代码都是完全正确的,但是如果放在多线程环境下,这些代码就很容易出错,我们称这些类为 线程不安全类 .多线程环境下使用线程安全类 才是安全的. 下面是一个线程不安全类的例子 ...

最新文章

  1. python页面跳转中_python web页面跳转
  2. 反病毒引擎设计全解(一)
  3. C++确定数字的奇偶校验的算法实现(附完整源码)
  4. 报错:failed to get the task for process XXX(解决方案)
  5. C++标准库之String
  6. django-编辑学生
  7. MySQL “error C3646: 'fd': 未知重写说明符”
  8. leetcode 《简单》 设计问题 Python实现
  9. 20190824:(leetcode习题)报数
  10. NYOJ243 - 交换输出
  11. ios visio流程图_微软visio绘图查看器ios版下载|Microsoft Visio Viewer iphone/ipad版下载 v1.17 - 跑跑车苹果网...
  12. 【开发日常】手动安装fastboot驱动(开发板连不上minitool)
  13. 【ODBC】ODBC连接数据库详细说明
  14. 女生学Java软件开发好就业吗
  15. PHP网页的工作原理
  16. BT06串口蓝牙模块的配置以及与电脑的配对
  17. CSS常见选择器的用法
  18. 盘点4种微信营销如何快速吸粉的方法
  19. 基于高分辨率影像城市绿地信息提取_[转]ENVI支持下利用高分辨率影像城市绿地信息提取方案...
  20. druid连接池监控

热门文章

  1. 花厂-nat转换四种类型
  2. jquery插件chosen 选择框无法重置
  3. HP惠普暗影精灵6Pro_OMEN 15.6英寸Gaming Laptop15-ek1013TX(2Y3L6AV)原装出厂Windows11系统恢复原厂OEM系统
  4. 大龄程序员的一次考研之旅
  5. RGB、YUV、HSV和HSL区别和关联
  6. java猜数游戏_java猜数游戏
  7. python程序设计基础李东方答案_李东方python程序设计基础答案
  8. 某项目标书写作经历之一
  9. Demeolition
  10. Python数据分析是什么?为什么要对比Excel学习Python数据分析?