伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

面试官让我写一个 ArrayList 的“bug”,并修复它!

来源:本站原创 浏览:79次 时间:2022-06-11

我们都知道,ArrayList 天生就不是线程安全的,但是很多人也就是道听途说而已。并没有实际的进行测试,也并不清楚 ArrayList 为什么不是线程安全的!

这不,昨天还有人问我为什么?说面试官让他写一个 bug。答案其实很简单,今天我们就一起来动手写一个“bug”!

看下面这个测试代码:

线程 MyThread 代码如下所示:

多次执行后,运行结果有两种。一种就是常见的 java.lang.ArrayIndexOutOfBoundsException 异常。

还有一种就是跑成功了,但是数据不对。甚至时不时会抛出个 IndexOutOfBoundsException 异常,这种情况很少见,多数情况下,都是直接抛出异常。

观察上面的代码,其实很简单,就是多线程,向 list 中 add 元素。但是,最终结果却和预期不一致。为什么会漏掉数据呢?

这是因为 List 对象,在做 add 时,执行 Arrays.copyOf 的时候,返回一个新的数组对象。当有线程 t1、t2、... 同时进入 grow方法,多个线程都会执行 Arrays.copyOf 方法,返回多个不同的 elementData 对象,假如,t1 先返回,t2 后返回,那么 List.elementData == t1.elementData,然后 t2 也返回后,这时 List.elementData == t2.elementData,所以,t2.elementData 就把 t1.elementData 数据给覆盖了。导致 t1.elementData 被丢失。

那么这种问题,怎么解决呢?

一种是使用 Vector,还有一种是使用 Collections.synchronizedList(new ArrayList()) 。但是你也要注意符合操作!

这就是,面试中,让我写一个“bug”,并修复一个“bug”。

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net