LinkedList线程不安全原理解析

        今天复习java集合时,百度LinkedList为什么线程不安全,无果,于是自己去看了源码。就拿最简单的add()解释一下吧!第一次看源码,如有错误,希望大佬们指正!

        首先,我们需要知道的是,LinkedList中主要有3个属性,size(结点数),first(头结点),last(尾结点)。

其中结点Node的数据结构如下图:

好了,知道这些基础知识后,接下来的分析就会变得非常简单了。LinkedList的add方法其实只是引用了linkLast()这一个方法。也就是先找到last结点,再new一个新结点,将新数据和之前的last结点链接后存放起来,再使header的last指针指向新结点即可。linkLast()方法代码如下图所示。

那么问题来了。

现在有3个结点n1、n2、n3。标记指针header的头结点指针first指向n1,尾结点指针last指向n3。

假如线程A、线程B同时要做add操作。

1.线程A找到last结点。

2.线程B找到last结点。(此时A、B找到的last结点是一样的)

3.线程A:新结点n4的previous设为last结点,之前的last结点的next设为新结点n4。size+1=4

4.线程B:新结点n5的previous设为last结点,之前的last结点的next设为新结点n5。size+1=5

此时,会出现这种情况:

看图就可以知道了,n3的next指向n5,header的last指向n5,直接跳过n4结点,所以这个n4可以说是废了。。。现在明白为什么LinkedList线程不安全了吧?加入的n4结点怎么都搜索不到,size的值和能找到的结点数对应不上了,当然不安全咯!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值