链接: Java 多线程梳理(一、线程概述).
- 线程安全问题
- 原子性
- 可见性
- 有序性
- java内存模型
2. 线程安全问题
多线程安全主要是指多个线程对同一个对象的实例变量进行操作时,会出现值被更改,值不同步的情况.
线程安全问题表现为三个方面: 原子性,可见性和有序性
2.1 原子性
原子(Atomic) 就是不可分割的意思. 原子操作的不可分割有两层含义:
- 访问(读,写)某个共享变量的操作从其他线程来看,该操作要么已经执行完毕,要么尚未发生, 即其他线程年看不到当前操作的中间结果
- 访问同一组共享变量的原子操作是不能够交错的
Java 有两种方式实现原子性:
- 一种是使用锁; 锁具有排它性,保证共享变量在某一时刻只能被一个线程访问.
- 一种利用处理器的 CAS(Compare and Swap)指令. CAS 指令直接在硬件(处理器和内存)层次上实现,看作是硬件锁
例:
如现实生活中从 ATM 机取款, 对于用户来说,要么操作成功,用户拿到钱, 余额减少了,增加了一条交易记录; 要么没拿到钱,相当于取款操作没有发生。