原子性

1 原子性

原子操作是指,对于访问同一状态的所有操作来说,这个操作室以一个原子方式执行的操作。
防止一个线程正在使用对象状态而另一个线程在同时修改该状态。

1.1 竞态条件

在并发编程中,由于不恰当的执行时序而出现不正确的结果,称为竞态条件。
常见的竞态条件就是“先检查后执行”。如:

  1. i++
  2. 延迟初始化中的懒汉模式

1.2 复合操作

包含一组必须以原子方式执行的操作以确保线程安全性。
要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量。

1.2.1 可重入性

重入意味着获取锁的操作颗粒是线程而不是调用。

1.2.2 内置锁(同步代码块)

同步代码开包含两个部分:

  1. 作为锁的对象引用
  2. 由这个锁保护的代码块

以关键字synchronized修饰的方法是一种横跨整个方法的同步代码块,同步代码的锁对象就是方法调用所在的对象,静态的synchronized方法以Class为锁对象。

1.2.3 锁

如果在复合操作执行过程中持有一个锁,会使其变成原子操作。
对于可能被多个线程同时访问的可变状态变量,在访问它使都需要持有同一个锁,我们称状态变量时由这个锁保护的。

通常的加锁约定为:将所有的可变状态都封装在对象内部,并通过对象内置锁对所访问的可变状态的代码路径进行同步,使得在该对象上不会发生并发访问。

在一个对象中,只有被多个线程同时访问的可变数据才需要通过锁来保护。

对于每个包含多个变量的不变性条件,其中涉及的所有变量都需要由同一个锁来保护。

wenxinzizhu wechat
扫一扫,添加我的微信,一起交流共同成长(备注为技术学习)