java - lock与synchronize的解锁顺序问题?
怪我咯
怪我咯 2017-04-18 10:49:35
0
2
720

在学习lock与synchronize的区别时,看到这样一句话:“ lock更灵活,可以自由定义多把锁的枷锁解锁顺序(synchronized要按照先加的后解顺序)”。请问这里:

1.lock的自由定义多把锁的枷锁解锁顺序怎么理解?
2.synchronized要按照先加的后解顺序怎么理解?

谢谢各位!

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
小葫芦

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。

左手右手慢动作
new lock1
new lock2

lock1.lock();
lock2.lock();
...
lock2.unlock();
lock1.unlock();

Lock的加解锁是在java语义层面上实现的,锁之间没有必然关系

synchronized(obj1){
    synchronized(obj2){
        ...
    }
}

synchronized加解锁是由JVM来实现,在执行完synchronized块后自行解锁,所有会按照synchronized的嵌套顺序解锁。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!