当前位置: 首页 > 面试题库 >

Java并发:CAS与锁定

柯浩壤
2023-03-14
问题内容

我正在阅读《 实践Java并发 》一书。在第15章中,他们讨论了非阻塞算法和 比较交换 (CAS)方法。

据记载,CAS的性能比锁定方法好得多。 我想问一下已经使用这两个概念的人,并想听听您何时更喜欢这些概念中的哪一个? 真的那么快吗?

对我来说,锁的用法更加清晰,易于理解,甚至维护起来也更好 (如果我错了,请纠正我)
。我们是否应该真正专注于创建与CAS相关的并发代码,而不是锁定,以获得更好的性能提升,或者可持续性更重要?

我知道何时使用什么可能没有严格的规定。 但是我只是想听听一些有关CAS新概念的意见和经验。


问题答案:

通常,CAS比锁定快得多,但是它确实取决于争用程度。因为如果数值在读取和比较之间变化,CAS可能会强制重试,因此,如果所讨论的变量受到许多其他线程的重击(或者计算新值的成本很高),则该线程理论上可能陷入忙碌等待中从旧值(或两者兼有)。

CAS的主要问题是正确编程比锁定困难得多。请注意,与使用消息传递或STM相比,使用锁反过来更难正确使用,因此请不要将其视为使用锁的敲门砖。



 类似资料:
  • 主要内容:示例,死锁解决方案示例死锁描述了两个或多个线程等待彼此而被永久阻塞的情况。 当多个线程需要相同的锁定但以不同的顺序获取时,会发生死锁。 Java多线程程序可能会遇到死锁状况,因为关键字会导致执行线程在等待与指定对象相关联的锁定或监视时出现阻止情况。 看看下面一个例子。 示例 当您编译并执行上述程序时,会出现死锁情况,以下是程序生成的输出 - 上述程序将永久挂起,因为两个线程都不能继续进行,等待彼此释放锁定,所以您可以按

  • 本文向大家介绍Java并发问题之乐观锁与悲观锁,包括了Java并发问题之乐观锁与悲观锁的使用技巧和注意事项,需要的朋友参考一下 首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再

  • 本文向大家介绍java并发编程之cas详解,包括了java并发编程之cas详解的使用技巧和注意事项,需要的朋友参考一下 CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术。简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。这听起来可能有一点复杂但是实际上你理解之后发现很简单,接下来,让

  • 问题内容: 我在阅读java.util.concurrent API 时发现 :同步帮助,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。 :同步帮助,它允许一组线程互相等待以到达一个公共的障碍点。 在我看来,两者似乎是平等的,但我相信还有更多的东西。 例如,在中。 两者之间还有其他区别吗?有人想 在哪里重置倒计时的值? 问题答案: 一个主要的区别是CyclicBarrier承担了一

  • 本文向大家介绍Java并发编程之闭锁与栅栏的实现,包括了Java并发编程之闭锁与栅栏的实现的使用技巧和注意事项,需要的朋友参考一下 一、前言 闭锁与栅栏是在多线程编程中的概念,因为在多线程中,我们不能控制线程的执行状态,所以给线程加锁,让其按照我们的想法有秩序的执行。 闭锁 CountDownLatch,实例化时需要传入一个int类型的数字(count),意为等待count个线程完成之后才能执行下

  • 本文向大家介绍详解java并发之重入锁-ReentrantLock,包括了详解java并发之重入锁-ReentrantLock的使用技巧和注意事项,需要的朋友参考一下 前言 目前主流的锁有两种,一种是synchronized,另一种就是ReentrantLock,JDK优化到现在目前为止synchronized的性能已经和重入锁不分伯仲了,但是重入锁的功能和灵活性要比这个关键字多的多,所以重入锁是