并发编程中的三个特性
- 原子性
一次操作要么成功要么失败。 - 可见性
多线程操作一个变量时,一个线程修改了值,要对另外线程可见。 - 有序性
执行有先后顺序
volatile关键字:保证不同线程对share操作的可见性,禁止对执行顺序的重排序。
不保证原子性 字节码文件 如:a++操作是先获取、修改、返回,没有原子性
保证可见性,保证有序性
volatile vs synchronized:
使用层面
volatile:修饰实例变量和类变量(即成员变量和静态变量),不能修饰方法和局部变量。
synchronized:不能修饰变量,只能修饰方法或代码块。
原子性
volatile不支持
可见性
都ok
有序性
都ok
其他
synchronized是阻塞的
volatile不会线程阻塞
JMM如何保证三大特性
- 原子性
i++ :有get有set的操作不是原子性的。
简单的操作放一起也不一定是原子的。
复杂的操作没办法保证,只能用synchronized、锁、AtomicInteger等 - 可见行
volatile
synchronized
JUC中的lock - 有序性
volatile
synchronized
JUC中的lock
常见并发工具类
CountDownLatch
CyclicBarrier
Semaphore