自定义显示锁
自定义显示锁思路
- 显示锁的实现主要使用了wait和notifyAll方法, 我们定义一个Boolean变量作为标志,同步lock方法里面首先判断当前锁是否被使用,如果被使用了自己加入一个等待队列(自定义一个集合)然后让自己wait, 如果没有被使用那么先把自己从等待队列移除, 可以直接把锁获取到设置bool值为true。
- 解锁方法:直接设置锁bool值为false然后notifyAll所有的等待线程
- 保证谁加的锁谁释放锁
- 注意:在等待synchronized的锁的线程使用interrupted是打不断的
- Synchronized 如果有线程需要这个锁会一直阻塞,但是自定义锁可以指定多久时间之后放弃请求锁
实现代码
public class BooleanBlock {
private boolean isBlock;
private Collection <Thread> blockThreads = new ArrayList<>();
private Thread curThread;
public BooleanBlock() {
isBlock = false;
}
public synchronized void lock() {
while(isBlock) {
this.blockThreads.add(Thread.currentThread());
this.wait();
}
this.curThread = Thread.currentThread();
this.blockThreads.remove(this.curThread);
this.isBlock = true;
}
public synchronized void unlock() {
if (Thread.currentThread() == curThread) {
this.isBlock = false;
this.notifyAll();
}
}
}