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 }阅读更多
相关文章推荐
- HOW TO Build Your Featured Content Slideshow Using S3Slider JQuery Plugin
- 在VC++6.0中出现failed to (or don't know how to) build 原因及解决方法
- How to Build Your Own Blockchain Part 2 — Syncing Chains From Different Nodes
- How to generate monkeyrunner build-in help?
- How to Build Distributed Concurrent System(思维草稿)
- how to build form
- rcp(插件开发)How to add a folder to java build path as library
- tesseract3.03:vs2013 + x64 / x86 +win7 + 《How to build tesseract 3.03 with Visual Studio 2013》
- 启动weblogic的错误:Could not obtain an exclusive lock to the embedded LDAP data files directory
- How to edit Team Build Types
- HOWTO build arm-linux toolchain for ARM/XSCALE
- How to add “Maven Managed Dependencies” library in build path eclipse?
- 编译自己的windows android sdk(how to build android sdk for windows)-chenyongxinglove的专栏
- How to build j2ee application on OpenShift (1)
- How to build Android adb for ARM
- How to build kernel for Beaglebone for custom cape support
- How to make XAML project to build faster on the Windows Platform
- How to build a Flex development platform based on Myeclipse8.6 &amp; Flex4
- SQL Server 2008 – How To Build and Deploy AdventureWorks OLAP Cubes
- How to generate gcc debug symbol outside the build target?