1. 为什么使用锁?
多线程操作带来的问题?
-
- 访问冲突;
- 锁竞争;
- 死锁;
- 锁的粒度;
- 上下文切换开销;
- 同步/内存拷贝开销等;
2. 线程安全
- Java内存模型(JMM)
- working memory & main memory
- 原子性;
- 可见性;
- 有序性;
- happens before原则
- 代码重排;
- 内存屏障;
- volatile;
- 锁;
3. Java内存模型
4. 原子性
- byte/short/int/char/boolean/float 读写原子性;
- long/double(64位)读写分两次32位操作,非原子性;
- int i++等组合操作,非原子性;
- synchronized同步块内的操作,具有原子性;
5. 可见性
- final
- 被final修饰的字段初始化完成可确保可见性;
- volatile
- 读写volatile字段确保可见性;
- synchronized
- 同步块内读写字段确保可见性;
- happens-before
- 符合happens-before次序的可见性;