Java中锁的类型

链接: https://www.nowcoder.com/questionTerminal/134aea222e0c4add9a9b0c63267a5e3c
来源:牛客网

1、自旋锁 ,自旋,jvm默认是10次吧,有jvm自己控制。for去争取锁
2、阻塞锁 被阻塞的线程,不会争夺锁。
3、可重入锁 多次进入改锁的域
4、读写锁
5、互斥锁 锁本身就是互斥的
6、悲观锁 不相信,这里会是安全的,必须全部上锁
7、乐观锁 相信,这里是安全的。
8、公平锁 有优先级的锁
9、非公平锁 无优先级的锁
10、偏向锁 无竞争不锁,有竞争挂起,转为轻量锁
11、对象锁 锁住对象
12、线程锁
13、锁粗化 多锁变成一个,自己处理
14、轻量级锁 CAS 实现
15、锁消除 偏向锁就是锁消除的一种
16、锁膨胀 jvm实现,锁粗化
17、信号量 使用阻塞锁 实现的一种策略
18、排它锁:X锁,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。

截止JDK1.8版本,java并发框架支持锁包括:   读写锁,   自旋锁,   乐观锁。

### Java 类型及使用场景 #### 内置(Synchronized) Java 的内置是通过 `synchronized` 关键字实现的。每个对象都有一个内置,当线程进入同步代码块或同步方法时需要获取该。这可以确保同一时间只有一个线程能够执行被保护的代码段,从而保障了线程安全和数据的一致性[^1]。 ```java public class SynchronizedExample { private final Object lock = new Object(); public void synchronizedMethod() { synchronized (this) { // 同步代码块 } } public synchronized void anotherSynchronizedMethod() { // 整个方法都是同步的 } } ``` #### ReentrantLock(可重入) `ReentrantLock` 提供了更灵活的定机制。它允许显式的调用 `lock()` 方法加锁以及 `unlock()` 方法解,并且必须在 `finally` 块中进行解操作以防止死的发生。相比 `synchronized`,这种方式更加复杂但也更为强大[^2]。 ```java import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockExample { private final ReentrantLock lock = new ReentrantLock(); public void doSomething() { try { lock.lock(); // 执行临界区代码 } finally { lock.unlock(); // 确保总是会释放 } } } ``` #### ReadWriteLock(读写) 对于那些频繁读取而不经常修改的数据结构来说非常有用。它可以允许多个读者同时访问资源,但在有写者存在的情况下则不允许任何其他线程(无论是读还是写)获得。这样可以在一定程度上提高性能[^3]. ```java import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriteLockExample { private final ReadWriteLock rwl = new ReentrantReadWriteLock(); public String readData() { rwl.readLock().lock(); try { return data; // 返回共享数据副本 } finally { rwl.readLock().unlock(); } } public void writeData(String newData) { rwl.writeLock().lock(); try { this.data = newData; // 更新共享数据 } finally { rwl.writeLock().unlock(); } } } ``` #### OptimisticLock(乐观) 这种类型假设冲突很少发生,在每次更新前都会先检查版本号或其他唯一标识符是否发生变化;如果发现变化,则放弃当前事务并重新尝试直到成功为止。适用于高并发环境下对少量竞争资源的操作. #### PessimisticLock(悲观) 与乐观相反,悲观假定会发生很多次的竞争情况,因此会在整个交易期间保持独占权限。适合于预期会有大量争用的情形下使用. #### CountDownLatch(倒计时存器) 虽然严格意义上不是一种“”,但它用于协调多个线程之间的进度关系。可以通过设置初始计数值来等待一组事件完成之后再继续前进。常用来做启动准备或者收集子任务的结果等用途. ### ReentrantLock 和 synchronized 的主要差异 除了上述提到的各种特性外,两者之间还存在着一些重要的区别: - **可重入性**: 都支持。 - **可中断性**: 只有 `ReentrantLock` 支持。 - **非阻塞获取的能力**: 只能由 `ReentrantLock` 实现。 - **公平策略的选择权**: `ReentrantLock` 具备此功能。 - **的状态监控能力**: 更容易通过 `ReentrantLock` 完成。 - **条件变量的支持度**: `ReentrantLock` 胜出。 综上所述,选择哪种取决于具体的应用需求和技术背景考虑因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值