无锁编程比自旋锁有什么优势?

问题描述

我想知道无锁编程比自旋锁有哪些优势?我认为当我们在一个线程(称为A)中使用CAS机制进行无锁编程时,如果其他线程更改了CAS中的值,则A线程仍然需要再次循环。而且我认为就像我们使用自旋锁一样!

我对此很困惑。虽然我知道CAS和自旋锁适合在锁争用不激烈的情况下使用,但有人可以解释在哪种情况下应使用无锁和应使用自旋锁吗?

解决方法

无锁提供了所谓的进度保证。没错,在示例线程A中确实执行了重试(即再次循环),但是仅当其他线程更改了值时,这暗示该线程能够取得进步。

相比之下,持有自旋锁的线程(我们将其称为X)会阻止所有其他线程取得进展,直到释放该锁为止。因此,如果抢占了线程X,则等待锁定的所有线程的执行将被有效地暂停,直到X可以恢复执行并最终释放锁为止。如果X被无限期地停滞,那么所有其他线程也将被无限期阻塞。

使用无锁算法不可能出现这种情况,因为可以保证至少有一个线程可以随时取得进展。


应根据情况使用哪种。无锁算法本质上难以设计,尤其是对于树等更复杂的数据结构而言。而且,即使您拥有无锁算法,它几乎总是比串行算法慢,因此受锁保护的串行版本的性能可能更好。再者,如果数据结构竞争激烈,那么无锁版本的伸缩性将优于受锁保护的版本。但是,如果您的工作负载大部分是只读的,则读写锁也将提供良好的可伸缩性。不幸的是,这里没有一般规则...


如果您想了解有关锁定自由的更多信息(以及更多),我推荐这本书The Art of Multiprocessor Programming
如果您更喜欢免费的替代产品,我推荐Paul McKenney的Is Parallel Programming Hard,And,If So,What Can You Do About It?或Keir Fraser的Practicallock-freedom

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...