【锁定】加锁解锁
@Slf4j
公共类TestLock {
公共静态void main(字符串[]参数)引发异常(
重入锁=新的重入锁(假);
string mainThreadName=thread。currentthread().getName();
系统。出去。println('======BEgin=====');
尝试{
新线程(()-{ 0
字符串名称=Thread.currentThread().getName();
锁定。lock();//第一次加锁
System.out.println('1-1 ',' lock。尝试lock());//第二次加锁
系统。出去。println(' 1-2 ',锁定。尝试lock());//第三次加锁
Thread.currentThread().' setName('线程a ');
//未解锁前,剩余锁数量:3
锁定。unlock();//解锁,剩余锁数量:2
锁定。unlock();//解锁,剩余锁数量:1
锁定。unlock();//解锁,剩余锁数量:0
系统。出去。println(name ' lock。getholdcount : '锁。getholdcount());//打印:0
}).start();
新线程(()-{ 0
字符串名称=Thread.currentThread().getName();
尝试{
线。睡眠(200);
} catch(中断异常){ e
e。print stack trace();
}
系统。出去。println(' 2 ',锁定。尝试lock());
Thread.currentThread().' setName('线程b’);
//System.out.println(名称);
如果(锁定。islocked()){ 0
系统。出去。println(name '=1=lock。getholdcount : '锁。getholdcount());
System.out.println(name '解锁');
锁定。unlock();
系统。出去。println(name '=2=lock。getholdcount : '锁。getholdcount());
}
}).start();
新线程(()-{ 0
字符串名称=Thread.currentThread().getName();
尝试{
线。睡眠(200);//睡眠时间与线程B相同,下面lock.unlock()会报IllegalMonitorStateException
//线程。睡眠(400);//lock.unlock()不会报IllegalMonitorStateException
} catch(中断异常){ e
e。print stack trace();
}
系统。出去。println(' 3 ',锁定。尝试lock());
Thread.currentThread().' setName('线程c ');
如果(锁定。islocked()){ 0
//因为睡眠时间相同,所以可能出现的情况:线程B获取到锁但还未解锁,再结合lock.isLocked()源码(任何线程),
//即锁还未被释放,进入判断后lock.unlock()失败,因为不符合:如果当前线程是该锁的持有者
System.out.println(name '解锁');
锁定。unlock();
}
}).start();
}捕获(例外e){ 0
log.error(e.getMessage(),e);
}
系统。出去。println(' mainThreadName '锁。是锁定: '锁。is locked());
系统。出去。println('======END====');
}
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/100421.html