与锁的比较
相同点
如果用锁保护临界区,那么同一时刻只会有一个线程在临界区内,其他线程都在临界区外面。lock-free 是所有线程都可以进临界区,但是最后只有一个线程可以继续往下执行,其它线程重做一次。所以,lock-free 和锁都只能同时让一个线程做有用的事,在性能上不会有质的区别。
不同点
lock-free 和锁的区别是面对条件竞争表现不同。出现条件竞争时,有锁的情况就是线程陷入内核,发生上下文切换,这个是有开销的。无锁的情况就是不断 spin。当临界区非常小,只需要一两条原子指令就可以完成时,上下文切换开销占的比重就比较大。此时,换成 lock-free 性能通常会提高很多。