Java线程--AtomicReference原子对象

AtomicReference原子对象

AtomicReference作用

是对”对象”T进行原子操作。

不使用引用变量,而是把对象存储在一个AtomicReference之中,不过需要说明的是,这样的编程,并不会让对象本身也是线程安全的,只是该引用变量的获取和设置是线程安全的。

除了AtomicReference原子对象之外,jdk5还引入了java.util.concurrent包并发包,包里有大量的原子类以及同步集合类,例如ConcurrentMap类。不管怎样,这些所谓的线程安全的类指的是“单个原子方法调用的时候才是安全的”。如果某一个业务需要一组原子语句的调用才能完成该业务的话,那么这一组语句仍然应该包含在一个同步代码块里面,才能保证同步,才能说该业务是线程安全的。

死记:多线程业务代码核心思想:

获得锁

临界区原子操作:一组语句访问一组相关的状态变量

释放锁

AtomicReference的源码剖析

public class AtomicReference implements Serializable {

    private static final Unsafe unsafe = Unsafe.getUnsafe(); //unsafe 实现CAS原子操作

    private volatile V value; //volatile可见性

    public AtomicReference(V var1) {
        this.value = var1;
    }

    /**
     * 读:volatile变量,在读时能确保读到的始终是当前内存的最新值
     */
    public final V get() {
        return this.value;
    }

    /**
     * 写:volatile变量,立即写回内存 并 保证其它cpu内的该值所在的缓存行无效(总线嗅探技术)
     */
    public final V getAndSet(V var1) {
        return unsafe.getAndSetObject(this, valueOffset, var1); //unsafe 实现原子操作
    }

    //.....省略.....
}

下面附上rt.jar包中的Unsafe类的部分源码:主要想表达java.util.concurrent包的灵魂:

/**
* volatile、CAS原理、自旋结构、组合在一起构成了java.util.concurrent包 
*
* volatile:修饰的变量如果是对象或数组,是指对象或数组的地址具有可见性,但是数组或对象内部的成员改变不具备可见性
*
* CAS原理:lock前缀指令,执行该cas指令时会锁住缓冲行
*
*自旋结构:for(;;){ 读内存值; if(cas操作){return;} }
*/ 

package sun.misc;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.security.ProtectionDomain;
import sun.reflect.CallerSensitive;
import sun.reflect.Reflection;

/**
* volatile, CAS操作, 自旋结构 组合在一起构成了java.util.concurrent包 
*
* volatile 修饰的变量如果是对象或数组,其含义是对象或数组的地址具有可见性,但是数组或对象内部的成员改变不具备可见性
*
* CAS操作; lock前缀指令,执行该cas指令时会锁住缓冲行
*
*自旋结构; for(;;){ 读内存值; if(cas操作){return;} }
*/

//Unsafe类在%JAVA_HOME%/jre/lib/rt.jar包中

public final class Unsafe
{
  
  private static final Unsafe theUnsafe = new Unsafe();
  public static final int INVALID_FIELD_OFFSET = -1;
  

  /**
  * 自旋结构:for(;;){ 读内存值; if(cas操作compareAndSwapObject){return;} }
  * 参数 paramObject1 cpu旧值
  * 参数 paramLong    偏移量
  * 参数 paramObject2 cpu新值
  */
  public final Object getAndSetObject(Object paramObject1, long paramLong, Object paramObject2)
  {
    Object localObject;
    do
    {
      localObject = getObjectVolatile(paramObject1, paramLong);
    } while (!compareAndSwapObject(paramObject1, paramLong, localObject, paramObject2));
    return localObject;
  }  
  //原子操作:比较并转换:cpu内旧值paramObject1, 偏移量paramLong, 内存当前值paramObject2, cpu内新值paramObject3  
  public final native boolean compareAndSwapObject(Object paramObject1, long paramLong, Object paramObject2, Object paramObject3);
  //原子操作:读取可见性内存值
  public native Object getObjectVolatile(Object paramObject, long paramLong);

  
  
  /**
  * 自旋结构:for(;;){ 读内存值; if(cas操作compareAndSwapInt){return;} }
  * 参数 paramObject1 cpu旧值
  * 参数 paramLong    偏移量
  * 参数 paramInt	  累加
  */
  public final int getAndAddInt(Object paramObject, long paramLong, int paramInt)
  {
    int i;
    do
    {
      i = getIntVolatile(paramObject, paramLong);
    } while (!compareAndSwapInt(paramObject, paramLong, i, i + paramInt));
    return i;
  }
  //原子操作:比较并转换:cpu内旧值paramObject1, 偏移量paramLong, 内存当前值paramObject2, cpu内新值paramObject3
  public final native boolean compareAndSwapInt(Object paramObject, long paramLong, int paramInt1, int paramInt2);
  public native int getIntVolatile(Object paramObject, long paramLong);


  /**
  * 自旋结构:for(;;){ 读内存值; if(cas操作compareAndSwapInt){return;} }
  * 参数 paramObject cpu旧值
  * 参数 paramLong   偏移量
  * 参数 paramInt    cpu新值
  */
  public final int getAndSetInt(Object paramObject, long paramLong, int paramInt)
  {
    int i;
    do
    {
      i = getIntVolatile(paramObject, paramLong);
    } while (!compareAndSwapInt(paramObject, paramLong, i, paramInt));
    return i;
  }

    
  
  public native void unpark(Object paramObject);
  public native void park(boolean paramBoolean, long paramLong);

  public void setMemory(long paramLong1, long paramLong2, byte paramByte)
  {
    setMemory(null, paramLong1, paramLong2, paramByte);
  }
  public void copyMemory(long paramLong1, long paramLong2, long paramLong3)
  {
    copyMemory(null, paramLong1, null, paramLong2, paramLong3);
  }
  public native void setMemory(Object paramObject, long paramLong1, long paramLong2, byte paramByte);
  public native void copyMemory(Object paramObject1, long paramLong1, Object paramObject2, long paramLong2, long paramLong3);


}

 

 

你可能感兴趣的:(Java,Thread,Java,Thread,线程)