码上敲享录 > java面试题及答案大全 > 为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?

为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?

上一章章节目录下一章 2023-07-11已有222人阅读 评论(0)

Synchronized锁被称为悲观锁的原因在于它的设计基于一种悲观的思想,即认为并发场景下会发生冲突,所以在进入临界区之前,需要获取锁来保护共享资源,防止其他线程的干扰。在使用Synchronized锁时,如果某个线程获取不到锁,则会被阻塞,直到获取到锁才能继续执行,这种悲观思想导致了线程在并发情况下不断地进行锁的竞争和上下文切换,可能会引起性能问题。


相比之下,乐观锁的设计基于一种乐观的思想,即认为并发场景下冲突的机会较低。乐观锁不会直接使用互斥锁来保护共享资源,而是在更新共享资源之前,首先进行检查或者预测是否会发生冲突。如果预测没有冲突,那么就直接进行更新;如果预测存在冲突,那么需要进行回退或者重试操作。


乐观锁的实现原理通常基于版本号或者时间戳。它会在共享资源上添加一个版本号或者时间戳,并将该版本号或者时间戳作为更新操作的一部分。通过比较版本号或者时间戳可以判断共享资源是否被其他线程修改过,从而决定是否进行回退或者重试的操作。


CAS(Compare and Swap,比较并交换)是乐观锁的一种常用实现方式。它是一种原子操作,用于实现对共享变量的原子更新。CAS操作包含三个参数:内存位置、旧的预期值和新的更新值。CAS操作会比较内存位置上的值和预期值,如果相等就将新的更新值写入到内存位置;如果不相等就不做任何操作。CAS操作是原子的,即在多线程的并发情况下,只有一个线程能够成功执行CAS操作。


CAS的特性包括:


1. 原子性:

CAS操作是原子的,保证了在并发情况下对共享变量的原子更新,不会发生数据不一致的问题。


2. 无锁:

由于CAS操作不需要使用互斥锁来保护共享变量,所以避免了悲观锁的开销,减少了线程的等待和上下文切换。


3. 自旋:

如果CAS操作失败,表示可能存在其他线程的干扰,这时候可以使用自旋来重试,避免了线程的阻塞和唤醒的开销。


需要注意的是,CAS操作虽然有很多优点,但也存在一些限制。例如,CAS操作无法解决ABA问题(即在操作期间,值被其他线程修改并恢复为旧值);另外,CAS操作在并发量较大时,可能会出现自旋重试次数过多的问题,进而降低性能。因此,在使用CAS操作时需要根据具体场景进行权衡和合理的选择。


0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交