在关于Lock的程序实现方法中,为啥test\u0026set这个方法是atomic的

你老师给你展示的是伪代码, 为了让你能理解这个操作的具体含义. 实际再实现的时候是单一指令的. 比如x86下是 CMPXCHGn the x86 (since 80486) and Itanium architectures this is implemented as the compare and exchange (CMPXCHG) instruction
■网友
学习论文:In 2003, Maurice Herlihy was awarded the Edsger W. Dijkstra Prize in Distributed Computing for his seminal 1991 paper "Wait-Free Synchronization" (see http://2003 Edsger W. Dijkstra Prize in Distributed Computingboost库中shared_ptr的cref是原子操作sp_counted_base_gcc_x86.hpp __asm__ __volatile__ ( "lock\\\t" "xadd %1, %0": "=m"( *pw ), "=r"( r ): // outputs (%0, %1) "m"( *pw ), "1"( dv ): // inputs (%2, %3 == %1) "memory", "cc" // clobbers );C++ lockfree实现spinlock来源于C/C++ Users Journal October, 2004给出一个java版本的实现import java.util.concurrent.atomic.AtomicBoolean;import java.util.concurrent.atomic.AtomicReference;public class SpinLock { private static Logger logger = LoggerFactory.getLogger(SpinLock.class); private AtomicBoolean flag = new AtomicBoolean(false); private AtomicReference\u0026lt;Thread\u0026gt; owner = new AtomicReference\u0026lt;Thread\u0026gt;(null); public void lock() { if (owner.get() == Thread.currentThread()) { logger.error("spin lock can not be locked repeatedly by an identical thread"); return; } boolean f; do { f = flag.get(); } while (f || !flag.compareAndSet(f, true)); owner.set(Thread.currentThread()); } public void unlock() { if (!owner.compareAndSet(Thread.currentThread(), null)) { logger.error("current thread is not owner of spin lock"); return; } if (!flag.compareAndSet(true, false)) { logger.error("weired error"); } } @Override public Object clone() throws CloneNotSupportedException { throw new CloneNotSupportedException(); }}
■网友
硬件支持CAS的原子操作
■网友
其实这段x86是这样的:mov (%), %%eaxtest %%eax,%%eaxjnz outmovl $1,%%edxlock cmpxchg %%edx, (%)
■网友
这是伪代码,实际的test-and-set 一般是硬件实现,也就是说三条伪代码对应的是一个不可中断的指令,具有原子性
■网友
我记得TSL是硬件层支持的,并不是从OS/软件层面支持的。所以可以保证原子性


    推荐阅读