读书人

java中公道锁的实现

发布时间: 2013-07-25 16:22:17 作者: rapoo

java中公平锁的实现
package com.cici.lock;import java.util.LinkedList;import java.util.List;/** * @author 尹定宇 * @Email 768166775@qq.com * @version 2013-7-18 下午4:53:39 * @info 公平锁的实现 */ public class FairLock {private boolean isLocked = false;private Thread lockingTh = null;private List<BinarySemaphore> semList = new LinkedList<BinarySemaphore>();public void lock() throws InterruptedException{BinarySemaphore bs = new BinarySemaphore();boolean isLockedForThisThread = true;synchronized(this){semList.add(bs);} while(isLockedForThisThread){synchronized(this){isLockedForThisThread = isLocked || semList.get(0)!=bs;if(!isLockedForThisThread){isLocked = true;semList.remove(bs);lockingTh = Thread.currentThread();return;}}try{ bs.semTake(); }catch(InterruptedException e){ synchronized(this) { semList.remove(bs); } throw e; }}} public synchronized void unLock(){if(lockingTh!=Thread.currentThread()){throw new IllegalMonitorStateException();}isLocked = false;lockingTh= null;if(semList.size() > 0){semList.get(0).semGive();}}}

?这里有一个有趣的细节,lock方法没有synchronized关键字修饰,而方法内两个有synchronized同步块。这是我们需要注意的,在一个一个对象synchronized同步块或方法内不要出现另一个对象的wait或notify操作,这样会导致一种结果和死锁很像的悲剧性后果,叫做“嵌套管成锁死”。

? ? 另外semTake方法可能会抛出InterruptedException异常,这说明线程在等待时被中断了,这时我们就需要把这个不可用的线程从队列中移除掉,这就是程序中出现的try。。catch的意义所在。

?

读书人网 >编程

热点推荐