java - lock与synchronize的解锁顺序问题?
问题描述
在学习lock与synchronize的区别时,看到这样一句话:“ lock更灵活,可以自由定义多把锁的枷锁解锁顺序(synchronized要按照先加的后解顺序)”。请问这里:
1.lock的自由定义多把锁的枷锁解锁顺序怎么理解?2.synchronized要按照先加的后解顺序怎么理解?
谢谢各位!
问题解答
回答1:Lock是一个接口,最常用的实现是 ReentrantLock,它的一个灵活之处是可以设定fair参数。
synchronized 和fair=false的ReentrantLock 无法决定加锁顺序。换句话说,线程A、B、C都要锁定对象,尝试锁定的时间是A最早、然后是B,最后是C,那么当A解锁对象时,不能确定到底B还是C接下来锁定对象。
如果用fair=true的ReentrantLock(公平锁),情况就确定了:A解锁对象时,由于B比C先尝试锁定对象,所以接下来一定是B来锁定,只有当B解锁时才轮到C。
回答2:new lock1new lock2lock1.lock();lock2.lock();...lock2.unlock();lock1.unlock();
Lock的加解锁是在java语义层面上实现的,锁之间没有必然关系
synchronized(obj1){ synchronized(obj2){... }}
synchronized加解锁是由JVM来实现,在执行完synchronized块后自行解锁,所有会按照synchronized的嵌套顺序解锁。
相关文章:
1. java - svn导下来的项目,web-inf下怎么没有lib文件呀?2. 这是什么情况???3. 统计 - MYSQL版本问题导致SQL语法错误!unknow column ’SQLSTR’4. docker start -a dockername 老是卡住,什么情况?5. javascript - 想问下百分比进度条实现原理以及这种布局怎么实现,还有赛马时背景跟着动的原理?6. Python的os.listdir在获取文件列表时的顺序问题7. node.js - 关于你不知道的JavaScript上一书介绍的行为委托8. python - Pycharm的Debug用不了9. javascript - 这是什么插件能把能把cli里面的webpack打包信息格式化?10. javascript - Vue.js2.0不能使用debounce后大伙一般是如何解决延迟请求的问题的呢。
