JAVA并发编程
# 第二章 线程安全性
线程安全性:当多个线程访问某个类式,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。
# 2.2 原子性
++count不是原子操作 包含“读取-修改-写入”操作序列
竞态条件 当某个计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件。正确的结果取决于运行 最常见的竞态条件类型是”先检查后执行“
复合操作 在java.util.concurrent.atomic包中包含了一些原子变量类。 使用包中的AtomicLong来代替long类型的计数器,能够保证所有对计数器状态的访问操作都是原子的。
# 2.3 加锁机制
# 2.3.1 内置锁
同步代码块(Synchronized Block) 同步代码块包括两部分:一个作为锁的对象引用,一个作为由这个锁保护的代码块。
synchronized(lock){
}
1
2
3
2
3
这些锁被称为内置锁或监视器锁。 线程进入同步代码块之前自动获得锁,退出代码块时自动释放锁。这是获得内置锁的唯一途径。
# 2.4
# 第三章 对象的共享
# 3.1 可见性
重排序? 为什么永远不停止?
volatile变量。编译器和运行时会注意到这个变量是共享的 不会将该变量上的操作与其他内存操作一起重排序 volatile是一种比synchronized关键字更轻量级的同步机制
加锁机制既可以确保可见性又可以确保原子性,而volatile只能确保可见性
当且仅当满足以下所有条件时,才应该使用volatile变量
- 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值
- 该变量不会与其他状态变量一起纳入不变性条件中
- 访问变量时不需要加锁