记录Java Synchronized关键字踩坑与实现原理解析
参考:
https://blog.youkuaiyun.com/luoweifu/article/details/46613015
https://blog.youkuaiyun.com/linmiansheng/article/details/80518130
首先介绍必须的背景知识:Lab6的v1实验实现了多线程的猴子过河模拟器,猴子们多线程的选择梯子时需要根据随机策略来选择梯子,两种策略如下:
空梯子优先策略:如果有空梯子就直接上去,否则随机选取一个行进方向与自身相同且梯子上第一个踏板是空着的的梯子的梯子上去;
最速梯子优先策略:考察梯子的整体推进速度,选择最推进速度的梯子上去。
刚开始实现空梯子优先策略的时候有如下两种实现方式:
- 猴子遍历的查看每个梯子,查看哪个梯子就锁住当前的梯子,如果是空梯可以直接上去,否则查看该梯子是否符合自身要求,如果符合就将该梯子加入待选列表,如果遍历完所有的梯子都未能找到空梯子,就在待选列表里随机选择一个梯子上去(此时选的时候仍需要锁住随机的这个梯子,而且需要再次查看这个梯子是否符合要求,可能会由于interleaving而导致该梯子被其他猴子捷足先登就需要将其删除并且重新选择。
- 猴子直接锁住所有的梯子,然后遍历的查看和选取。
经过大量的测试证明,第一种方式减小了锁的范围,效率比第二种方式要高,第二种方式基本退化为串行选择梯子,只不过是增加了由于多线程而带来的随机性。
最速梯