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

来源:5-12 无锁境之给面试官讲讲无锁编程(Lock-Free Programming)(下)

莫失聪聪3779259

2021-08-10

在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回答

老鼠不上树

2021-08-13

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

0
3
老鼠不上树
回复
莫失聪聪3779259
CAS是一个原子操作,当某一个pop操作成功即这个CAS成功,那么其它线程的CAS都会失败,在这一刻成功线程的pop()操作返回的一定是头节点,其它线程的pop()/push()操作会更新它们的head和stamp,然后继续CAS
2021-08-24
共3条回复

笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机

深度剖析大厂面试高频真题,让你秒变offer收割机

1783 学习 · 314 问题

查看课程