请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

在pop()方法的49行 head.compareAndSet(); 如果cas失败,那么下面return ref.value返回的是什么?

在pop()方法的49行 head.compareAndSet(ref,next,stamp,stamp+1); 如果cas失败,那么下面return ref.value返回的是什么?是指失败之后的老的head节点?还是被其他线程cas更新后的新的head节点?
我认为是被其他线程更新后新的head节点,因为ref是head.getReference的引用变量,实际值是head.getReference,而我看源码内部是一个pair,被volitai修饰,所以head.getReference会读到主存中的最新head值,那么ref.value就是最新的head值。但是我不明白,return 最新主存中的head是对的吗?还是我理解错了。。求指教。(cas成功时我能理解,返回当前要删除的旧head,新的head 指向 旧head的next。)

正在回答

1回答

LockFreeStack.java,可以看下源码,老师已经改了,只有CAS操作成功才能返回弹出的头节点,如果失败相当于要弹出的头节点已经不是头节点了,需要重新进循环

0 回复 有任何疑惑可以回复我~
  • 提问者 莫失聪聪3779259 #1
    嗯,是的。代码有些问题。我说怎么看起来怪怪的。修改后就没问题了
    回复 有任何疑惑可以回复我~ 2021-08-13 23:29:51
  • 提问者 莫失聪聪3779259 #2
    我认为是被其他线程更新后新的head节点,因为ref是head.getReference的引用变量,实际值是head.getReference,而我看源码内部是一个pair,被volitai修饰,所以head.getReference会读到主存中的最新head值,那么ref.value就是最新的head值。但是我不明白,return 最新主存中的head是对的吗?
    回复 有任何疑惑可以回复我~ 2021-08-15 13:15:35
  • 老鼠不上树 回复 提问者 莫失聪聪3779259 #3
    CAS是一个原子操作,当某一个pop操作成功即这个CAS成功,那么其它线程的CAS都会失败,在这一刻成功线程的pop()操作返回的一定是头节点,其它线程的pop()/push()操作会更新它们的head和stamp,然后继续CAS
    回复 有任何疑惑可以回复我~ 2021-08-24 14:13:38
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信