ReentrantLock基础
ReentrantLock入门
ReentrantLock是一种基于AQS框架的实现,也是JDK1.5后的一种线程并发访问的同步手段,它类似于synchronized是一种互斥锁,可以保证线程安全。它比synchronized更多的特性,比如它支持加锁的公平性、支持手动加锁与解锁。
基础使用
import java.util.concurrent.locks.ReentrantLock;
/**
* @program: 多线程测试
* @description:
* @author: cc百川 https://blog.csdn.net/ljcc122/
* @create: 2021-04-10 13:52
**/
public class Test1_UserLock {
private static int count = 0;
public static void main(String[] args) throws InterruptedException {
ReentrantLock rlock = new ReentrantLock();//*1* 默认申请非公平锁[^1] NonfairSync
for(int i=0;i<10;i++) {
new Thread(()->{
doRun(rlock);
}, i+"").start();
}
Thread.sleep(1000);
System.out.println(count);
}
/**
* 线程run方法内部逻辑
* @param rlock
*/
public static void doRun(ReentrantLock rlock){
rlock.lock();//*2*锁竞争标识
//获得锁后进入下面的逻辑,没有获取锁的进入自旋等待当前锁释放*3*
try{
for(int i=0;i<100;i++)
count++;
} finally {
rlock.unlock();//用完后释放锁,这也就是与synchronized的区别之一需要显示的加释锁
}
}
}
公平锁FairSync与非公平锁NonfairSync
公平锁简单理解就是不区分身份,每一个任务都需要排队。比如:高考进场,不区分你是班长还是课代表,都需要排队进场。
非公平锁简单理解就是,任务由高低可以插队。比如:银行VIP机制,VIP不管后面有没有排队都插队。
公共代码解读
//加锁核心
public final void acquire(int arg) {
//尝试获取锁,获取失败则自旋进入同步队列,并阻塞自己 LockSupport.park(this);
if (!tryAcquire(arg)