ReentrantLock根据源码分析公平锁加锁流程
2020-02-06 13:54:08   0  举报             
     
         
 ReentrantLock根据源码分析公平锁加锁流程
    作者其他创作
 大纲/内容
 tryAcquire()
  ws==-1
  sync.lock(); 
  执行业务逻辑
  判断要不要排队
   h != t && ((s = h.next) == null || s.thread != Thread.currentThread());
  node.prev==head
  根据当前线程实列化一个node
  队列有没有初始化
  false
  tryAcquire返回false
  h=t=headh!=t返回false
  未被持有
  tryAcquire返回true
  自旋初始化队列并将node入队
  被持有
  acquireQueued
  parkAndCheckInterrupt()
  修改ws的状态:ws=-1,并返回false
  自旋
  t1持有锁,t2入队之后(aqs队列中有两个元素)通过自旋获取锁,然后将head指向自己,此时aqs中只有一个元素
  执行LockSupport.park(this)方法,阻塞线程
  AQS中有2个以上元素head\\t2\\t3
  true
  addWaiter入队
  被初始化
  acquire(1)
  判断锁状态
  h=t=nullh!=t返回false
  线程t
  reentrantLock.unlock()
  enq(node)
  CAS加锁
  AQS中有2个元素t2和head
  AQS中有1个元素head
  reentrantLock.lock()
  h!=t返回true((s = h.next) == null || s.thread != Thread.currentThread())返回true
  h!=t返回true((s = h.next) == null || s.thread != Thread.currentThread())返回false
  入队
   
 
 
 
 
  0 条评论
 下一页
  
   
  
  
  
  
  
  
  
  
 