目的
- 了解ReentrantLock获取锁、释放锁的流程
代码
package com.company.aqs;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* ReentrantLock使用案例——使用ReentrantLock加锁
* @Author: Alan
* @Date: 2022/11/20 01:38
*/
public class ReentrantLockDemo {
private static int sum=0;
private static Lock lock=new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 3; i++) {
new Thread(()->{
// 获取锁
lock.lock();
try {
for (int j = 0; j < 1000; j++) {
sum++;
}
}finally {
// 在finally代码块中释放锁
lock.unlock();
}
}).start();
}
// 保证所有线程执行完毕
Thread.sleep(1000);
System.out.println(sum);
}
}
复制代码
这是一个使用ReentrantLock实现多线程求和的案例。代码逻辑比较简单,外层循环开启了3个线程,然后每个线程内多sum累加1000,最后输出结果sum=1000。
获取锁流程
整个过程概括起来就做了两件事儿
- 获取锁成功,执行当前线程内的其他事情;
- 获取锁失败,当前线程加入同步队列,同时阻塞当前线程。
当第一个线程(thead0)进来的时候,通过CAS去修改state属性为1,如果成功