序言:本系列是通读《Java并发编程实战》一书,对里面的某些描述进行摘选,希望对初识线程安全的你们有所帮助。
1. 线程安全性定义:当多个线程访问某个类时,这个类始终都能表现出正确的行为,则称这个类时线程安全的。
2. 常见的加锁约定:将所有的可变状态都封装在对象内部,并通过对象的内置锁对所有访问可变状态的代码路径进行同步,
使得在该对象上不会发生并发访问。在许多线程安全类中都使用了这种模式,例如Vector和其他的同步集合类。
3. 并非所有数据都需要锁的保护,只有被多个线程同时访问的可变数据才需要通过锁来保护。
4. Java内存模型要求,变量的读取操作和写入操作都必须是原子操作,但对于非volatile类型的long和double变量,JVM允许将64位的读操作或写操作分解为两个32位的操作。因此在多线程中使用共享且可变的long和double等类型的变量是不安全的,除非用关键字volatile来声明它们,或者用锁保护起来。
5. 加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。
6. 当且仅当满足以下所有条件时,才应该使用volatile变量:
1)对变量的写入操作不依赖变量的当前值,或者能确保只有单个线程更新变量的值;
2) 该变量不会与其他状态变量一起纳入不变性条件中;
3) 在访问变量时不需要加锁。
这段描述有些官方,更多扩展信息可以参考: