彤哥说源码-死磕 java同步系列之自己动手写一个锁Lock
整体思路:最重要的是需要标识对象当前是已加锁状态还是未加锁状态。
所以可以设定一个变量,当其为1时说明已加锁,为0时说明未加锁,
但是对于这个变量,所线程的环境下,同一时刻只能有一个线程将它修改,并且为1时其他线程就不可以修改了,这就是典型的cas操作,所以我们需要使用Unsafe这个类来做CAS操作。
然后,我们知道在多线程的环境下,多个线程对同一个锁的争用肯定只有一个能成功,那么,其它的线程就要排队,所以我们还需要一个队列。
最后,这些线程排队的时候干嘛呢?它们不能再继续执行自己的程序,那就只能阻塞了,阻塞完了当轮到这个线程的时候还要唤醒,所以我们还需要Unsfae这个类来阻塞(park)和唤醒(unpark)线程。
基于以上四点,我们需要的神器大致有:一个变量、一个队列、执行CAS/park/unpark的Unsafe类。
网友评论