一、术语
- 有状态(无状态)
- 线程安全
- 原子性
- 竞态条件
要编写线程安全的代码,其核心是要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问。
- “共享”意味着变量可以由多个线程同时访问
- “可变”则意味着变量的值在其生命周期内可以发生变化。
如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题。
- 不在线程之间共享该状态变量
- 将状态变量修改为不可变的变量
- 在访问状态变量时使用同步
【重要定义】
二、线程安全
2.1 线程安全的定义
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称为这个类是线程安全的
2.2 线程安全知识点
当在无状态的类中添加一个状态时,如果该状态完全由线程安全的对象管理,那么这个类仍然是线程安全的(eg:使用AtomicLong来管理类计数变量)
当在不变性条件中涉及多个变量时,各个变量之间并不是彼此独立的,而是某个变量的值会对其他变量的值产生约束。因此,当更新某一个变量时,需要在同一个原子操作中对其他变量同时进行更新。
要保持状态的一致性,就需要在某个单个原子操作中更新所有相关的状态变量。
三、原子操作
原子操作是指,对于访问同一个状态的所有操作(包括操作本身)来说,这个操作是一个以原子方式执行的操作
当在不变形条件中涉及多个变量时,各个变量之间并不是彼此独立的,而是某个变量的值会对其他变量的值产生约束。因此,当更新某一个变量时,需要在同一个原子操作中对其他变量同时进行更新。
如果只是每个方法都是同步方法,eg:Vector,那么并不足以确保Vector上符合操作都是原子的
四、锁
锁技术可以用来保证原子性和保护状态
Java提供了一种内置锁机制来支持原子性,同步代码块(Synchronized Block)
并发环境中的原子性和事务应用程序中的原子性有着相同的含义——一组语句作为一个不可分割的单元被执行
使用锁时应尽量缩小锁范围
网友评论