ReentrantLock lock()流程
2021-03-16 10:39:44 11 举报
Java ReentrantLock lock()流程
作者其他创作
大纲/内容
公平锁
addWaiter(Node)
sync.lock()--默认非公平锁(NonfairSync)
addWaiter(Node)(同非公平锁)
非公平锁:判断state是否为0,如果为0,则尝试获取锁;否则判断是否为当前线程占用,如果是,则增加占用数state。如果上述都不是的话,直接返回false
tryAcquire(1)
sync.lock()
获得占用之后,设置state为1,并且设置占用的线程为自己
下一次循环中,如果节点的状态为SIGNAL,则调用parkAndCheckInterrupt方法
Thread.currentThread().interrupt()
tryAcquire(arg)
parkAndCheckInterrupt()
公平锁直接调用acquire(1),非公平锁会先用CAS操作尝试获取锁
判断节点状态,如果状态为初始化状态0,则CAS设置node节点的状态为SIGNAL(-1)
调用LockSupport.park(this),将当前线程阻塞
nonfairTryAcquire(acquires)
enq(Node)
acquire(1)
如果阻塞过程中其他线程对当前线程进行了中断操作,则相应该中断
非公平锁
CAS设置tail头结点进行初始化,否则CAS设置tail尾结点
生成一个新的Node节点,判断当前队列中是否有节点,如果有的话,设置节点与新节点之间的关系,CAS设置当前节点为tail尾结点,如果设置设置成功,则直接返回。否则进入enq(Node)方法
被唤醒之后,在下一次for循环中,再次进入tryAcquire(arg)
设置head节点
lock()
公平锁:如果state为0,则进入hasQueuedPredecessors方法中判断是否有前置节点,如果没有,则尝试获取锁;否则判断是否为当前线程占用,如果是,则正价占用数state。如果上述都不是的话,直接返回false
0 条评论
下一页