Java多线程存在安全性问题的三个必备条件:
- 处于多线程环境下
- 多个线程共享一个资源
- 对资源进行非原子性操作
解决线程安全性问题的方法:
- 使用synchronized关键字(串行执行,同一时刻只有一个线程进入synchronized方法体或同步块),jdk1.6后对synchronized进行优化,引入了——偏向锁、轻量级锁、重量级锁
- volatile能保证变量在线程之间的可见性,防止重排序
- jdk所提供的原子类 java.util.concurrent.atomic.*
- 使用Lock(常用AQS、ReentrantLock、ReadWriteLock等)—— 包括共享锁和排他锁
常见的锁类型
- 偏向锁
- 轻量级锁
- 重量级锁
- 重入锁
- 自旋锁
- 共享锁
- 独占锁
- 排他锁
- 读写锁
- 公平锁
- 非公平锁
- 死锁
- 活锁
- .......等等