首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

论wait跟notify的正确使用方法-可重入锁的实现

2013-07-16 
论wait和notify的正确使用方法-可重入锁的实现? ? ? ? ? ?上一篇中的Lock有一个缺陷,参考以下代码lock.loc

论wait和notify的正确使用方法-可重入锁的实现

? ? ? ? ? ?上一篇中的Lock有一个缺陷,参考以下代码

lock.lock();/*** do sth. ***/lock.lock();/*** do another thing ***/lock.unLock();/*** do another thing ***/lock.unLock();

?

猜猜在第二次调用lock方法时会出现什么事情?是的,这个线程被自己给堵塞了!

?

所以,我们要求一个锁应当是”可重入的“,它不会被自己堵塞,而且只有调用unlock的次数等于lock的次数,锁才能被正确地释放,这里我们考虑用一个int来记录锁的层数,如果是0,就带表没有锁,当一个线程试图lock一个已经被自己lock过的对象时,就将count+1;如果unlock则减一,如果到0了就notify一个其他线程

package com.cici.lock;/** * @author 尹定宇 * @Email 768166775@qq.com * @version 2013-7-14 下午7:38:41 * @info */public class ReentantLock {private int count = 0;private Thread lockedTh = null;public synchronized void lock() throws InterruptedException{Thread curTh = Thread.currentThread();if(curTh==lockedTh){count ++;return;}while(count>0){wait();}lockedTh = curTh;count = 1;}public synchronized void unLock(){Thread curTh = Thread.currentThread();if(curTh!=lockedTh){throw new IllegalMonitorStateException();}else{count--;if(count==0){notify();lockedTh = null;}}}}

?

热点排行