Java锁

本文介绍了Java中的几种锁机制,包括公平锁和非公平锁的概念,其中synchronized和ReentrantLock(默认非公平)作为示例。可重入锁允许线程递归获取锁以避免死锁。自旋锁在无法获取锁时会循环等待,减少上下文切换。此外,讨论了独占锁(如写锁)和共享锁(如读锁)的区别,以及它们在ReentrantReadWriteLock中的应用。
摘要由CSDN通过智能技术生成

公平锁,非公平锁,可重入锁,递归锁,自旋锁
(共享锁)读锁,(独占锁)写锁,互斥锁
独占式:只有一个线程能执行,具体的 Java 实现有 ReentrantLock。
共享式:多个线程可同时执行,具体的 Java 实现有 Semaphore和CountDownLatch。
手写一个自旋锁

公平锁和非公平锁

公平锁:多个线程按照申请锁的顺序来获取锁
非公平锁:不按照顺序,有点是吞吐量比公平锁大。

synchronized也是非公平锁

ReentrantLock默认非公平锁

/**
 * Creates an instance of {@code ReentrantLock}.
 * This is equivalent to using {@code ReentrantLock(false)}.
 */
public ReentrantLock() {
    sync = new NonfairSync();
}

/**
 * Creates an instance of {@code ReentrantLock} with the
 * given fairness policy.
 *
 * @param fair {@code true} if this lock should use a fair ordering policy
 */
public ReentrantLock(boolean fair) {
    sync = fair ? new FairSync() : new NonfairSync();
}

可重入锁

也叫递归锁,指的是同一个线程外层函数获得锁之后,内层递归函数仍能获取该锁的代码,在同一个线程外层方法获取锁的时候,在进入内层方法会自动获取锁
线程可以进入任何一个它已经拥有的锁所同步着的代码块。
可重入锁最大作用就是避免死锁。

synchronized和ReentrantLock都是可重入锁。

下面就是可重入锁,sendsms外层获得锁,sendemail内层自动获取锁,同一把锁。
在这里插入图片描述

自旋锁

是只尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU
cas就是自旋锁do while循环

在这里插入图片描述

独占锁(写锁)

该锁一次只能被一个线程所持有,ReentrantLock和synchronized都是独占所。

共享锁(读锁)

指该锁可以被多个线程所持有。
ReentrantReadWriteLock其读锁是共享锁,写锁是独占锁。
如果用ReentrantLock,不管读写都锁。

关于synchronized看我另一篇
synchronized讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值