Java并发 chapter2 线程安全
线程安全:本质上是管理 可变共享状态 的访问,线程中的所有状态都安全 //引入状态安全概念
状态安全:状态参与的不变约束、先验约束、后验约束 皆满足 //状态安全指不违背任何约束
#参与同一个约束的不同状态间不独立,所有的约束将状态分为了各个相互独立的状态集合,每个状态集合的访问都需要使用同一个锁,从而保证一个状态的修改不影响所有关联的约束
#多个线程同时访问一个状态,且存在写操作,必须同步。如果不存在写,则可以看作在时间区间内是不可变的,可变是相对于时间的
#串行是安全的:自然顺序保证了各个访问在时间上无交集(互斥),且满足可见性
3种情况下对状态的访问是安全的
1.不可变(无状态)
2.不跨线程即不被共享
3.访问时同步(原子性:不可分割,状态一致性。可见性:之后访问的线程需确定约束可满足)
2、3是通过限制访问(时间上无交集)
锁:同步的工具
#内部锁(jvm记录锁的占有者(线程)),同时保证原子性与可见性,可重入(实现为jvm计数、记录拥有锁的线程)
#重入锁 由线程获取锁,而非单次调用获取锁。可递归、子类调用父类方法、状态集粒度的锁
#锁看是一种资源的抽象,互斥量
#锁保证安全的大前提:对状态的访问都先获取锁。加锁约定:封装+内部锁
原子性与可见性:原子性保证自身安全(状态不被其他线程改变,则约束始终满足),可见性保证别人安全
#原子性与可见性在体系结构中也有所体现,体系结构中需要处理寄存器、缓存、内存中数据的一致性,并发则需要线程间共享内存与工作内存中数据的一致性
原子性:状态的访问互斥
竞态:执行过程中 并发的操作可能 修改状态 破坏约束,通过互斥避免其他线程修改状态
如果状态被并发改变,则原子性被破坏=>原子性:状态不被并发改变=>互斥
第一层抽象:状态可能被修改。互斥,通过独占锁独占相应的状态
第二层抽象:状态间不独立。维护所有状态集,状态集之间独立,状态集内部关联,对一个状态集中的每个变量访问都须获得同一个锁
#无状态是空集
第三层抽象:复合操作作为原子操作,互斥整个操作,则包含了其中的状态集
#操作是多个状态的状态转移

浙公网安备 33010602011771号