一、引言
在学习JUC并发包的时,会介绍Lock锁。为了更深入的了解Lock锁的机制,我们可以自定义一个Lock锁,这样去读Lock源码可能好理解一点。
二、自定义Lock锁 1、定义Lock接口
public interface Lock {
class TimeOutException extends Exception {
public TimeOutException(String message) {
super(message);
}
}
void lock() throws InterruptedException;
void lock(long mills) throws InterruptedException, TimeOutException;
void unlock();
Collection getBlockedThread();
int getBlockedSize();
}
2、Lock实现类
public class BooleanLock implements Lock {
// 表示对象的锁是否被占用,true表示对象锁已经被占用
private boolean initValue;
// 表示被阻塞线程的集合
private Collection blockedThreadCollection = new ArrayList();
// 记录获得当前对象锁的线程
private Thread currentThread;
public BooleanLock() {
this.initValue = false;
}
/**
* 加锁,使用synchronized实现同步
*/
@Override
public synchronized void lock() throws InterruptedException {
// 如果锁已经被占用,则阻塞当前线程
while (initValue) {
//将线程加入到阻塞线程集合
blockedThreadCollection.add(Thread.currentThread());
this.wait();
}
// 锁没有被占用,则当前线程获得锁
blockedThreadCollection.remove(Thread.currentThread());
this.initValue = true;
this.currentThread = Thread.currentThread();
}
/**
* 当线程等待一定时间后,没有释放锁,则其他线程抛出超时异常
*/
@Override
public synchronized void lock(long mills) throws InterruptedException, TimeOutException {
if (mills
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?