关于并发包当中的ReenTrantLock 的实现等我研究完ConcurrentHashMap 之后再看看
可重入锁使用的目的:
保证线程访问时的线程安全;
与普通锁的区别:
可重入锁可以避免线程死锁
场景描述:多线程访问场景,其中获得了锁的线程可能重复获得锁
即: Thread1 --->lock Thread2 ---> wait() Thread3 ----> wait() Thread4 ---> wait()
Thread1 ---->lock (重复加锁 如果解锁过程只有一次 则造成死锁)
public class Lock{
boolean isLocked = false;
Thread lockBy = null ;
int lockCount = 0;
public synchronized void lock () { ////////加锁方式
Thread thread = Thread.currentThread();
while( isLocked && lockBy != thread ){
wait () ;
}
isLocked = true ;
lockCount ++ ;
lockBy = thread;
}
public synchronized void unlock () {
if ( Thread . currentThread ( ) == this . lockBy ) {
lockCount --; ////////// 防止出现获得了锁的线程双重加锁后 却只解锁一遍 造成死锁
if ( lockCount == 0 ) {
isLocked = false ;
notify();
}
}
}
}
网友评论