synchronized:同步(synchronization)就是指一个线程访问数据时,其它线程不得对同一个数据进行访问,即同一时刻只能有一个线程访问该数据,当这一线程访问结束时其它线程才能对这它进行访问。
可见性
synchronization的两条规定:
线程解锁前,必须把共享变量的最新值刷新到主内存
线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值。
原子性:
由于synchronized能够保证任一时刻只有一个线程执行,那么自然就不存在原子性问题了,从而保证了原子性。
volatile:
可见性
volatile的两条规定:
1.volatile变量每次被线程访问时,都强迫从主内存中读取该变量的值。
2.当变量发生变化的时候都会强迫线程将最新的值刷新到主内存中。
这样不同的变量总能看到最新的值。能够保证volatile变量的可见性
不足:一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。
原子性
只能保证单个volatile变量的原子性,对于volatile++这种复合操作不具有原子性
synchronized和volatile的比较
- synchronized锁住的是变量和变量的操作,而volatile锁住的只是变量,而且该变量的值不能依赖它本身的值。
- volatile算是一种轻量级的同步锁,volatile不需要加锁,比synchronized更加轻量级,不会阻塞线程。
- synchronized既能保证可见性,又能保证原子性,而volatile只能保证可见性,无法保证原子性。
注:由于voaltile比synchronized更加轻量级,所以执行的效率肯定是比synchroized更高。在可以保证原子性操作时,可以尽量的选择使用volatile。在其他不能保证其操作的原子性时,再去考虑使用synchronized。



