什么是并发?
并发是指两个或多个事件在同一时间间隔发生
并发会带来哪些问题?
-
更新丢失
-
不一致读
隔离与不变性
隔离: 划分数据,使得每一片数据都只能被一个执行单元访问。
例:word软件,小明打开一个文件,其他人无法打开这个文件或者只能打开这个文件的一个只读拷贝。
不变性: 只有在共享数据可以修改的情况下,并发问题才会出现。所以,一个避免并发冲突的方法是识别那些是不变的数据。
乐观并发控制和悲观并发控制
悲观锁:
避免冲突,数据约束较为强势
- 读锁(共享锁):可以一次多个人对一份数据加锁,但是只要有人得到了一个读锁,其他人就都无法再得到写锁。
- 写锁(排它锁):一旦有人得到了一个写锁,其他人就都不能再得到读锁或写锁的任何一种。
乐观锁:
检测冲突,数据约束较为友好
通常将冲突检测建立在数据的某种版本标记上,可能是时间戳,也可能是顺序计数器。另一种方法是使用时序读(处理、维护的代价较大)。
悲观锁和乐观锁选择的标准
冲突的频率与严重性
应用场景:
悲观锁 → word文件,如果有人已经打开了文件,其他人只能读,不能写。
乐观锁 → SVN,提交时有版本检测,标记冲突
死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
处理死锁:
1.已经发生死锁时,选择一个牺牲者放弃他的锁,可以通过超时控制、检查机制选择牺牲者
2.预防死锁的出现,例如:规定每个人获取锁的顺序和数量