1.
Atomic..系列的对象属于
在多线程程序中,能保证对该对象的操作的原子性,常用在需要做递增、递减操作的变量,如计数器。
2.
volatile
能保证所修饰的变量的在并发状态下的可见性,但无法保证原子性。
ps:
可见性是指,多个线程之间,总能看到变量的最新值。
原子性是,针对变量的读--改--写操作
只有当所修饰的变量满足如下条件时,才能用volatile做线程同步:
1. 对变量的写入操作不依赖于当前值。
2. 变量不会跟其他状态变量一起纳入不变性条件中。
即: —— 变量真正独立于其他变量和自己以前的值 ——
3.
synchronized
既能保证可见性,又能保证原子性。
不过程序性能开销较大,另外,synchronized修饰方法,或者程序块。
修饰方法时,被修饰的对象为(this),整个方法体都在同步范围内。
修饰代码块时,必须要提供被同步的对象,并且不能为基本数据类型,但是volatile修饰的可以是基本数据类型。