cas不是底层加锁了吗,为啥说执行时不需要加锁
时间: 2023-12-01 18:02:59 浏览: 29
CAS 确实使用了一种底层的加锁机制,但是其本质仍然是一种乐观锁实现。这是因为 CAS 操作在执行时并不会一直持有锁,而是只有在进行更新操作时才使用了底层的加锁机制,而且这个加锁的过程是非常短暂的。在执行 CAS 操作时,它会先读取内存中的值,然后与预期的值进行比较,如果相等,就使用新值进行更新,并返回操作成功;如果不相等,就说明内存中的值已经被其他线程修改过了,CAS 操作会返回操作失败。这个过程并没有对共享变量进行加锁,只是在更新过程中使用了一种基于硬件的原子操作,这种操作是非常快速的,而且不需要像悲观锁那样在执行期间一直持有锁,所以 CAS 可以被看作是一种乐观锁。
相关问题
所以乐观是否是从共享变量的角度来看的,即使cas底层加锁了,但是并不是对共享变量加的锁,所以还是乐观锁的范围内对吗
是的,乐观锁和悲观锁的区别是从对共享变量的加锁方式来区分的。在乐观锁中,我们假设对共享变量的并发操作不会产生冲突,因此不对共享变量进行加锁,而是在更新共享变量时通过比较预期值和实际值来判断是否存在冲突,从而实现并发控制。而在悲观锁中,我们假设对共享变量的并发操作非常频繁,因此在访问共享变量时就会进行加锁,以防止其他线程同时访问该变量。
虽然 CAS 操作在底层使用了一种基于硬件的加锁机制,但是在执行 CAS 操作时,并没有对共享变量进行加锁。CAS 操作的本质仍然是一种乐观锁实现,它假设对共享变量的并发操作不会产生冲突,而在更新共享变量时通过比较预期值和实际值来判断是否存在冲突,从而实现并发控制。因此,即使 CAS 操作在底层使用了一种加锁机制,但从共享变量的角度来看,它仍然是一种乐观锁的实现。
cas底层使用了cpu的lock指令,为啥还是乐观锁
CAS(Compare and Swap)操作是一种乐观锁的实现。虽然在 CAS 操作的实现中使用了 CPU 的 lock 指令,但其本质上仍然是乐观锁。这是因为,在 CAS 操作中,我们假设更改操作不会与其他并发操作发生冲突,因此在执行时不需要加锁。如果发现其他并发操作已经修改了被操作的数据,那么 CAS 操作会失败并立即返回,让上层应用程序重新尝试操作。
使用 CAS 操作实现乐观锁的好处在于,相对于悲观锁的加锁操作,CAS 操作无需进行加锁和解锁的操作,避免了由于频繁加锁和解锁而导致的性能瓶颈。在并发量不是很高的情况下,使用 CAS 操作实现乐观锁可以更好地发挥系统性能。