原子性 :
即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行
可见性:
可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
有序性:
即程序执行的顺序按照代码的先后顺序执行。
volatile:
volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM底层volatile是采用“内存屏障”来实现的。
1.保证可见性
2.不保证原子性
3.禁止指令重排序
1.AtomicInteger
final int get() //去的当前值
final void set( int newValue ) //设置当前值
final int getAndSet( int newValue ) //设置新值,并返回旧值
final boolean compareAndSet( int expect, int u ) //如果当前值为expect,则设置为u
final int getAndIncrement() //当前值加1,返回旧值
final int getAndDecrement() //当前值减1,返回旧值
final int getAndAdd( int delta ) //当前值增加delta,返回旧值
final int IncremenAndGet() //当前值加1,返回新值
final int decremenAndGet() //当前值减1,返回新值
final int addAndGet( int delta) //当前值增加delta,返回新值
2.Unsafe(不推荐使用,不同jdk实现方法不一样)
3.AtomicReference
对引用进行修改
是一个模板类,抽象化数据类型
主要有get、set 、compareAndSet、getAndSet方法还有layzeSet、weakCompareAndSet
4.AtomicStampedReference
带有邮戳(注:时间戳等,能够标识唯一性的,且有序的数据)的的引用修改类。
应用场景如:多线程写操作时对于数据敏感情况下,监听某一数值条件并进行有限次写操作的情况下,需要对数据当前引用对象进行时间判断是否,这里注意不能用compareAndSet虽然值可能相同,但是我们进行的是有限次写操作,读操作获得值的时间可能在AtomicReference.compareAndSet时取得是值是相同,但对象可能已经被其他线程修改但与当前值相等。所以需要AtomicStampedReference;
5.AtomicIntegerArray、ReferenceArray、LongArray
6.AtomicIntegerFieldUpdater
让普通变量也享受原子操作
方法:
<U> AtomicIntegerFieldUpdater.newUpdater( Class<U> tclass , String fieldName);
注:普通变量需要加上volatile