面试题之手写lock锁
1、首先创建一个类、随便叫啥名,实现一下lock,大概有这么几个接口需要实现
2、上篇文章我们总结了几个重要点,这里在回顾下
(1) 调用lock方法加锁
(2) 通过cas加锁
(3)加锁成功设置拥有者为当前线程
(4) 加锁失败,加入等待队列,线程休眠
(5) 调用unlock方法解锁,释放锁之后唤醒队列线程
最主要实现lock(),tryLock(),unlock()方法
3、首先我们需要设置拥有者线程,我们用原子类(AtomicReference)来保证线程安全
4、建立一个阻塞队列(LinkedBlockingQueue),将加锁失败的线程,添加入队列
5、TryLock方法
通过cas进行加锁,如果cas成功则返回true,如果失败则返回false
6、lock方法
调用tryLock方法加锁,如果加锁失败,将线程加入wait队列,进行线程休眠(park),被唤醒后把当前线程从队列移除
7、unlock方法
通过cas方法释放锁,释放锁成功唤醒(unpark)队列中的线程
8、运行试一下效果
将ReentrantLock替换成自己写的HandwritingLock,运行一下看看效果,案例看上一篇文章