Java并发:CAS与锁定
我正在阅读Book Java Concurrency in Practice。 在第15章中,他们正在讨论非阻塞算法和比较与交换(CAS)方法。
据写道,CAS性能比锁定方法好得多。 我想问问那些已经与这两个概念合作过的人,并且希望听到您何时更喜欢这些概念中的哪一个? 它真的太快了吗?
对我而言,锁的使用更加清晰易懂,甚至更好维护(如果我错了,请纠正我的错误)。 我们是否真的应该专注于创建与CAS相关的并发代码而不是锁,以获得更好的性能提升,还是可持续性更重要?
我知道有什么时候使用什么可能没有严格的规定。 但我只想听听一些意见,体会CAS的新概念。
CAS通常比锁定快得多,但它取决于争用的程度。 因为如果读取和比较之间的值发生变化,CAS可能会强制重试,所以如果所讨论的变量被许多其他线程严重打击,或者如果计算新值的开销很大,理论上可能会使线程陷入繁忙等待状态从旧值(或两者))。
CAS的主要问题是正确编程比锁定困难得多。 请注意,锁定反过来比消息传递或STM更难正确使用,所以不要把它作为使用锁定的响亮背书。
操作的相对速度在很大程度上不成问题。 与基于锁的算法和非阻塞算法之间的可伸缩性有什么不同。 如果你在1或2核心系统上运行,不要再考虑这样的事情。
非阻塞算法一般比较好,因为它们比基于锁的算法具有更短的“关键部分”。
您可以查看ConcurrentLinkedQueue和BlockingQueue之间的数字。 您将看到的是,CAS在中等程度(在现实应用程序中更现实)线程优势下明显更快。
非阻塞算法最具吸引力的特性是,如果一个线程发生故障(高速缓存未命中,或者更糟糕,seg故障),那么其他线程就不会注意到这种故障并且可以继续运行。 但是,在获取锁的时候,如果锁保持线程出现某种操作系统故障,那么等待锁释放的每个其他线程也会被中断。
要回答你的问题,是非阻塞的线程安全算法或集合(ConcurrentLinkedQueue,ConcurrentSkipListMap / Set)可以明显快于它们的阻塞对象。 正如Marcelo指出的那样,获得非阻塞算法的正确性非常困难,需要很多考虑。
您应该阅读关于Michael和Scott Queue的内容,这是ConcurrentLinkedQueue的队列实现,并解释了如何使用单个CAS处理双向,线程安全的原子函数。
链接地址: http://www.djcxy.com/p/66511.html上一篇: Java Concurrency: CAS vs Locking
下一篇: Intel C++ cannot convert `T **` to `T const * const *`, GCC can