【笔记】并发
一篇文章带你解析,乐观锁与悲观锁的优缺点 乐观锁与悲观锁 乐观锁与悲观锁不是指具体的什么类型的锁,而是指看待并发同步的角度。 定义 适用场景 使用 优缺点 悲观锁 悲观的认为,不加锁的并发操作一定会出问题。 写操作非常多 就是利用各种锁(synchronized独占锁) 保证数据安全 使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗cpu资源 乐观锁 认为对于同一个数据的并发操作,是不会发生修改的。 读操作非常多 无锁编程,采用的是CAS算法,典型的例子就是原子类,通过CAS自旋实现原子操作的更新。 不加锁会带来大量的性能提升。 冲突多时,自旋消耗大 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。 (2)一个线程持有锁会导致其它所有需要此锁的线程挂起。 (3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。 CAS 定义 CAS,compare and swap的缩写,比较并交换。 CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。 存在的问题 ABA问题。 但是如果一个值原来是A,变成了B,又变成了A