DrewJhung's Blog

synchronized vs volatile in java

Synchronized vs. Volatile

jmm(java memory model)使所有排序指令happens-before 规则。synchronized 和 volatile 都会使得线程本地缓存失效, 重新从主存取值;在多线程操作下, 会使编译器不能做重排序的优化(遵循happens-before)

二者相同点:

  • 保证公共属性值得可见性

这2个的区别:

  • synchronized 保证公共属性的可见性和原子性;volatile 则只能保证可见性不能保证原子性, 举个栗子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 1、value++; 操作需要2步操作:
* (1). int tmp = value;
* (2). value = tmp + 1
* 2、线程A 在操作完(1)之后,
* 并且已经做了(2)的相加操作,
* 当要赋值的时候另一个线程B, 操作(1)(2),
* 实际上应该加了2次, 但是最终计算只相加了一次
*/
public class NotBeAtomic extends Thread {
private volatile int value;
public int add(){
return value++;
}
}

Reference

When exactly do you use the volatile keyword in Java?