线程安全本质上是管理 可变共享状态 的访问
多个线程同时访问一个状态,且存在写操作,必须同步 #如果不存在写,则可以看作在时间区间内是不可变的,可变是相对于时间的
串行是安全的:自然顺序保证了时间上无交集
3种情况下对状态的访问是安全的
1.不可变(无状态)
2.不跨线程
3.访问时同步
2、3是通过限制访问(时间上无交集)
状态安全:不变约束、前置条件、后置条件 通通满足
原子性:状态的访问互斥
竞态:执行过程中 并发的操作可能 修改状态 破坏约束,通过互斥避免
如果状态被并发改变,则原子性被破坏=>原子性:状态不被并发改变=>互斥
参与约束的变量之间不独立——状态集合需要由同一原子操作更新,任一状态改变可能违反约束,竞态的延伸
锁:互斥,串行
内部锁(jvm记录锁的占有者(线程)),同时保证原子性与可见性,可重入(jvm计数)
锁看做一种必要资源,互斥量
第一层抽象:锁是互斥量(资源)
第二层抽象:维护所有非独立的变量,对其中的每个变量访问都须获得同一个锁
第三层抽象:复合操作作为原子操作,互斥整个操作,则包含了其中的状态集
可见性?
原文:https://www.cnblogs.com/qmc2077/p/11431864.html