您的位置:首页 > 产品设计 > UI/UE

How to build a exclusive Lock

2014-01-21 09:47 302 查看

阻塞lock的基本流程

if(cas(0,acquire)) setExclusiveOwnerThread else if(current==getExclusiveOnwerThread) {      setState(c+acquires) } addWaiter park ........................ for(;;) {
p = node.predecessor if(p==head&&tryAcquire(arg)){
[blockquote]setHead(node)
return[/blockquote]
} park
}   阻塞release的基本流程 if(current!=getExclusiveOnwerThread){ IllegalMonitorStateException } if(c == 0){ setExclusive(null) free = true } setState(c) return free unparkSuccessor(LockSupport.unpark(thread))   非阻塞lock的基本流程 if(cas(0,acquire))       setExclusiveOwnerThread   true else if(current==getExclusiveOwnerThread)      setState(c+acquire)    true false   非阻塞的release的基本流程 与阻塞的release流程相同     阻塞共享lock的基本流程 tryAcquireShared(acquires){ for(;;) { remaining = state-acquires if(remaining<0 || CAS(state,remaining)) return remaining } }     if(tryAcquireShared(arg)<0){      node = addWaiter(Node.SHARED)      for(;;) {
p = node.predecessor propagate = tryAcquireShared(arg) if(p==head&&propagate>=0){
setHead(node) if(propagate>0||next==null||next.isShared())//如果还有剩余,继续唤醒接下来一个节点      doReleaseShared() 
return
} park
     } }   阻塞共享release的基本流程 tryReleaseShared(acquires){
for(;;){      if(cas(state,state+acquires))            return true }  
} if(tryReleaseShared(acquires)) {      unparkSuccessor(h) }          
共享lock的基本模式 覆盖tryAcquireShared方法
for(;;) {
if(state-acquire<0) {
false
}
if(cas(state,state-acquires)) {
true
}
}
  共享lock的release的基本模式 覆盖tryReleaseShared方法
for(;;) {
if(cas(state,state+acquires)) {
true
}
}
 排它lock的基本模式 覆盖tryAcquire方法
if(state==0) {
if(cas(state, state+acquire)) {
setExclusiveOwnerThread(current)
return true
}
} else if(current==getExclusiveOwnerThread) {
if(cas(state, state+acquire)) {
return true
}
}
return flase
 排它lock的release基本模式 覆盖tryRelease方法
if(current != getExclusiveThread) {
throw new IllegalMonitorStateException()
}
nextc = state-release
if(nextc == 0) {
setState(nextc)
setExclusiveOwnerThread(current)
return true
} else {
setState(nextc)
return false
}
  阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: