Lock接口
lock() 没完没了的试 挂起
trylock() 一次不成就算了
trylock(time,timeunit) 超时后就算了
lockinterruptibly() 被动等通知 可中断
newCondition 等待池。如果唤醒和挂起倒置 会死锁
reentrantL
lock() 没完没了的试 挂起
trylock() 一次不成就算了
trylock(time,timeunit) 超时后就算了
lockinterruptibly() 被动等通知 可中断
newCondition 等待池。如果唤醒和挂起倒置 会死锁
reentrantLock:加锁和解锁的次数要求一致,解锁次数少锁不释放,多则报错。 存在count值记录加锁次数。
加锁流程:线程先判断count是否为0,为0则认为没有占用,获取owner。如果count不为0,判断owner是不是自己。是则count+1否则进入等待队列。cas操作的是count
解锁流程:优先判断owner是否是自己,是则count-1(为0则解锁完成,owner处理为null,唤醒等待队列头线程;不为0,结束);如果不是自己,报错。
基本结构接近synchronized heavy weight lock
读写锁(ReenTrantReadWriteLock): 内部分开读锁写锁,两锁互斥。并行读,串行写。
基本流程:owner,readcount,writecount;
加写锁前,判断readcount,如果为0,则判断writecount,为零则cas,不为0判断owner是否为自己,是则重入,不是则进入等待
加读锁前,判断writecount,如果为0,cas readcount。否则进入等待队列。多个读锁cas自旋更新readcount,不许要更新owner