知识卡片

隔离与不变性是应对并发的两大根本策略

普通读书笔记卡

内容

并发问题的根源是多个执行单元同时访问同一片可修改的数据,因此最根本的两种解法都是从这个前提本身下手,而不是在”允许多人同时改同一份数据”的基础上打补丁。隔离:把数据划分开,让每一片数据只能被一个执行单元访问——操作系统给每个进程分配独立内存空间就是这个思路的体现,文件锁(打开文件后别人只能拿到只读副本,看不到你正在做的修改)也是同样的道理。隔离能大幅降低出错概率,好的并发设计应该主动去找各种能创建隔离区的办法,并想办法让尽可能多的工作能在隔离区内完成,而不是让每个人时刻提心吊胆地手动处理并发。不变性:既然并发问题只发生在共享数据可以被修改的场合,那么识别出哪些数据其实不变(或者几乎总是不变),就可以放心地广泛共享它们而不必操心并发控制——当然不可能让所有数据都不变,但只读数据完全可以被拆分出来、单独使用一份只读拷贝,从而把这部分负担从并发控制中解放出来。可迁移启发:面对并发问题的第一反应不该是”该用乐观锁还是悲观锁”,而是先问”这片数据能不能被隔离开来专属于一个执行单元”和”这片数据是不是根本不需要被修改”——真正棘手的并发控制手段,只留给隔离和不变性都用不上的那部分可变共享数据。

参考来源

- 位置:《企业应用架构模式》第一部分"表述"之"第5章 并发"之"5.3 隔离与不变性"(源文件:_epub-src/OEBPS/Text/000032.html) - 结论依据:原文说明"并发问题发生在多个执行单元(例如进程或线程)同时访问同一片数据的时候。一个解决的办法就是隔离:划分数据,使得每一片数据都只能被一个执行单元访问……只有在共享数据可以修改的情况下,并发问题才会出现。所以,一个避免并发冲突的方法是识别哪些是不变的数据",直接支撑本卡结论。 - 原始内容:好的并发设计应该是:找到各种创建隔离区的办法,并且保证在每个隔离区里能够完成尽可能多的任务。