锁的建模分析方法

目录

#why

#抽象游戏模型

#游戏模型分析

#java8对读写锁的优化

#分布式锁模型 vs. 多线程锁模型的差异

#排队论(queuing theory)及scale

#附录

 

#why

最近听完同事多线程锁的分享,最大的感受是没有构建一个非常明确的模型,以便很多知识点较散、不便理解、记忆。这也是本篇wiki目的,用建模的思路去记忆锁的技术。

 

#抽象游戏模型

这是一个一群玩家竞争有限资源的游戏。这个游戏涉及三个元素:玩家、资源、守护者:

1) 玩家:这不是孤立的游戏、而是社交游戏。我们有很多玩家同时在线,他们都渴望使用资源。他们可以group成联盟、也可以选择独立行事。

他们可合作、也可竞争,这是他们的社交性。

2) 资源:游戏的目的在于追求资源的利用价值最大化。

3) 守护者。他是资源的管理者,负责制定规则、并做监管。他可以选择制定很高门槛的准入规则,也可以实施宽松的策略、冲突后监管。

标准的排队模型

乐观与悲观锁的模型差异:

#游戏模型分析

 

 

特性

设计策略

玩家

1)尽最大努力获取资源;

社交性(social):玩家既可以是朋友、也可以是敌人。有天然分组(group)的特性。存在公平性的问题。

读者/写者。公平问题。

资源

1)追求资源的利用价值最大化。

共享性(shared):对于可共享的资源,增大reuse效率。

让旁大的读者sharing资源。

独占 vs 共享:shared。

有限性(limited):资源相对有限,可适当增加/减少资源数量。

抽象 多资源模式。

守护者

1)保护资源有序性修改;

2)最小的管理成本;

监看(Watch):能看到所有玩家及资源的状态,是游戏的主载者。

维护全局玩家及资源的状态。

守护(Guard:制定规则,包含管理等待玩家,及处理资源运行时冲突、异常等情况。

“谁能不能进去、进去后出了乱子怎么搞。”

队列机制,发号器(玩家坐着等通知、还是站着排队)。

悲观 vs 乐观阻塞 vs 自旋。可重入 vs. 不可重入。公平 vs. 允许插队。

智能化(smart & intellect):关于自动化的本质,是让游戏编写者(programmer)人工配置参数、还是做依赖运行时状态、利用数据不断升级决策算法。

组合多种锁资源策略,动态选择

 

按此模型结构化整体的锁知识:

 

#java8对读写锁的优化

java8引入了:StampedLock、优化了读者与写者互斥问题(它没有implement readwrite lock接口)。老的readwrite lock读多写少、读写互斥、写可能抢不过而被等待很久,StampedLock引入spin lock机制,让写玩家来了就干,可能会出现读玩家被踢出来的场景。读玩家如果发现值被修改了、就再读一次新值。

 

#分布式锁模型 vs. 多线程锁模型的差异

分布式锁引入的新变量是:

1、在分布式里每个人都是不稳定的。体现在状态上。alive、die、unknown(network timeout)、suspended这四种状态,可以按明确状态(alive、die)、不明确状态(unknown)、以及错误状态(suspended)等。

2、网络延迟导致玩家当前状态与守护者的状态永远无法same、只能同步sync。

 

建模之后的分析及解决方案,就不做过深描述了。

 

#排队论(queuing theory)及scale

这个模型本质上排队论,对排队论不扩展。只启发地谈一个案例、如何将排队模型scale到其它领域上去,提升知识利用率。

技术团队接需求,就是经典的排队模型,需求就是玩家、开发就是资源、排期机制就是守护者。有的需求优先级高、允许插队,有的需求躺在需求池里太久、timeout了直接就抛弃掉。我们怎么决策要招多少技术、怎么衡量资源整体的效率?如何去做量化?ok!排队论里有一个Little law,套在需求排期的场景下就是:

 

生产周期(Lead Time) = 在制品数量WIP * 平均需求完成时间。 lead time类似周转率,越小越好。

 

这说明为了提升研发效率,一方面可以减少需求数量、提升质量,另一方面可以短期增加开发人数、长期提升团队能力以降低平均需求完成时间。这是一个最简单的排队模型,约束条件较多,还可以更深入的建模,以便更科学的量化效率指标。

 

#附录

1、java jdk locks包下的类结构:

 

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/package-summary.html

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/StampedLock.html

 

2、其它资源

https://wiki.mbalib.com/wiki/%E6%8E%92%E9%98%9F%E7%90%86%E8%AE%BA

https://www.cnblogs.com/rjzheng/p/9310976.html

https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html

https://www.jdon.com/artichect/crdt.html

https://less.works/less/principles/queueing_theory.html

http://www.shedejie.com/waiyu/67144.html

 

发布了91 篇原创文章 · 获赞 7 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/Ture010Love/article/details/93308793
今日推荐