锁的分类

简介: 锁的分类

1. 公平锁与非公平锁

按照线程访问顺序获取对象锁。 synchronized 是非公平锁, Lock 默认是非公平锁,可以设置为公平 锁,公平锁会影响性能。

publicReentrantLock() {
sync=newNonfairSync();
    }
publicReentrantLock(booleanfair) {
sync=fair?newFairSync() : newNonfairSync();
}

2. 共享式与独占式锁

共享式与独占式的最主要区别在于:同一时刻独占式只能有一个线程获取同步状态,而共享式在同一时 刻可以有多个线程获取同步状态。例如读操作可以有多个线程同时进行,而写操作同一时刻只能有一个 线程进行写操作,其他操作都会被阻塞。

3. 悲观锁与乐观锁

悲观锁,每次访问资源都会加锁,执行完同步代码释放锁, synchronized 和 ReentrantLock 属于悲观锁。 .乐观锁,不会锁定资源,所有的线程都能访问并修改同一个资源,如果没有冲突就修改成功并退出,否 则就会继续循环尝试。乐观锁最常见的实现就是 CAS 。

适用场景: 悲观锁适合写操作多的场景。 乐观锁适合读操作多的场景,不加锁可以提升读操作的性能。

4. 乐观锁有什么问题?

  • 乐观锁避免了悲观锁独占对象的问题,提高了并发性能,但它也有缺点:
  • 乐观锁只能保证一个共享变量的原子操作。
  • 长时间自旋可能导致开销大。假如CAS长时间不成功而一直自旋,会给CPU带来很大的开销。
  • ABA问题。CAS的原理是通过比对内存值与预期值是否一样而判断内存值是否被改过,但是会有以 下问题:假如内存值原来是A, 后来被一条线程改为B,最后又被改成了A,则CAS认为此内存值并 没有发生改变。可以引入版本号解决这个问题,每次变量更新都把版本号加一。
相关文章
|
4月前
|
安全 Java 开发者
Lock锁和AQS之间的关系与区别:基于第一原理的深入分析
【11月更文挑战第26天】在Java并发编程中,锁(Lock)和队列同步器(AbstractQueuedSynchronizer,简称AQS)是两个核心概念。它们为多线程环境下的同步和互斥提供了强大的支持。本文将从第一原理出发,深入探讨Lock锁和AQS之间的关系与区别,同时分析它们的相关概念、业务场景、历史背景、功能点以及底层原理,并使用Java代码进行模拟实现。
60 1
|
10月前
|
存储 人工智能 关系型数据库
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
|
10月前
|
Java 编译器 程序员
synchronized 原理(锁升级、锁消除和锁粗化)
synchronized 原理(锁升级、锁消除和锁粗化)
|
存储 Java C++
【全网最细系列】synchronized锁详解,偏向锁与锁膨胀全流程
【全网最细系列】synchronized锁详解,偏向锁与锁膨胀全流程
651 0
锁消除、锁粗化、锁升级区别与联系
锁消除、锁粗化、锁升级区别与联系
锁消除、锁粗化、锁升级区别与联系
|
SQL 关系型数据库 MySQL
从一个案例深入剖析InnoDB隐式锁和可见性判断(2)
从一个案例深入剖析InnoDB隐式锁和可见性判断
从一个案例深入剖析InnoDB隐式锁和可见性判断(2)
|
NoSQL 关系型数据库 索引
从一个案例深入剖析InnoDB隐式锁和可见性判断(1)
从一个案例深入剖析InnoDB隐式锁和可见性判断
从一个案例深入剖析InnoDB隐式锁和可见性判断(1)
|
存储 关系型数据库 MySQL
从一个案例深入剖析InnoDB隐式锁和可见性判断(4)
从一个案例深入剖析InnoDB隐式锁和可见性判断
154 0
|
存储
锁的粗化和细化
锁的粗化和细化
204 0
锁的粗化和细化