最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java concurrency之AtomicReference原子類(lèi)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年06月06日 11:50:23   投稿:mrr  
AtomicReference是作用是對(duì)"對(duì)象"進(jìn)行原子操作。這篇文章主要介紹了Java concurrency之AtomicReference原子類(lèi),需要的朋友可以參考下

AtomicReference介紹和函數(shù)列表

AtomicReference是作用是對(duì)"對(duì)象"進(jìn)行原子操作。

AtomicReference函數(shù)列表

// 使用 null 初始值創(chuàng)建新的 AtomicReference。
AtomicReference()
// 使用給定的初始值創(chuàng)建新的 AtomicReference。
AtomicReference(V initialValue)
// 如果當(dāng)前值 == 預(yù)期值,則以原子方式將該值設(shè)置為給定的更新值。
boolean compareAndSet(V expect, V update)
// 獲取當(dāng)前值。
V get()
// 以原子方式設(shè)置為給定值,并返回舊值。
V getAndSet(V newValue)
// 最終設(shè)置為給定值。
void lazySet(V newValue)
// 設(shè)置為給定值。
void set(V newValue)
// 返回當(dāng)前值的字符串表示形式。
String toString()
// 如果當(dāng)前值 == 預(yù)期值,則以原子方式將該值設(shè)置為給定的更新值。
boolean weakCompareAndSet(V expect, V update)

AtomicReference源碼分析(基于JDK1.7.0_40)

在JDK1.7.0_40中AtomicReference.java的源碼如下:

public class AtomicReference<V> implements java.io.Serializable {
  private static final long serialVersionUID = -1848883965231344442L;
  // 獲取Unsafe對(duì)象,Unsafe的作用是提供CAS操作
  private static final Unsafe unsafe = Unsafe.getUnsafe();
  private static final long valueOffset;
  static {
   try {
    valueOffset = unsafe.objectFieldOffset
      (AtomicReference.class.getDeclaredField("value"));
   } catch (Exception ex) { throw new Error(ex); }
  }
  // volatile類(lèi)型
  private volatile V value;
  public AtomicReference(V initialValue) {
    value = initialValue;
  }
  public AtomicReference() {
  }
  public final V get() {
    return value;
  }
  public final void set(V newValue) {
    value = newValue;
  }
  public final void lazySet(V newValue) {
    unsafe.putOrderedObject(this, valueOffset, newValue);
  }
  public final boolean compareAndSet(V expect, V update) {
    return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
  }
  public final boolean weakCompareAndSet(V expect, V update) {
    return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
  }
  public final V getAndSet(V newValue) {
    while (true) {
      V x = get();
      if (compareAndSet(x, newValue))
        return x;
    }
  }
  public String toString() {
    return String.valueOf(get());
  }
}

說(shuō)明:

AtomicReference的源碼比較簡(jiǎn)單。它是通過(guò)"volatile"和"Unsafe提供的CAS函數(shù)實(shí)現(xiàn)"原子操作。

(01) value是volatile類(lèi)型。這保證了:當(dāng)某線程修改value的值時(shí),其他線程看到的value值都是最新的value值,即修改之后的volatile的值。

(02) 通過(guò)CAS設(shè)置value。這保證了:當(dāng)某線程池通過(guò)CAS函數(shù)(如compareAndSet函數(shù))設(shè)置value時(shí),它的操作是原子的,即線程在操作value時(shí)不會(huì)被中斷。

AtomicReference示例

// AtomicReferenceTest.java的源碼

import java.util.concurrent.atomic.AtomicReference;
public class AtomicReferenceTest {
  public static void main(String[] args){
    // 創(chuàng)建兩個(gè)Person對(duì)象,它們的id分別是101和102。
    Person p1 = new Person(101);
    Person p2 = new Person(102);
    // 新建AtomicReference對(duì)象,初始化它的值為p1對(duì)象
    AtomicReference ar = new AtomicReference(p1);
    // 通過(guò)CAS設(shè)置ar。如果ar的值為p1的話,則將其設(shè)置為p2。
    ar.compareAndSet(p1, p2);
    Person p3 = (Person)ar.get();
    System.out.println("p3 is "+p3);
    System.out.println("p3.equals(p1)="+p3.equals(p1));
  }
}
class Person {
  volatile long id;
  public Person(long id) {
    this.id = id;
  }
  public String toString() {
    return "id:"+id;
  }
}

運(yùn)行結(jié)果:

p3 is id:102
p3.equals(p1)=false

結(jié)果說(shuō)明:

新建AtomicReference對(duì)象ar時(shí),將它初始化為p1。

緊接著,通過(guò)CAS函數(shù)對(duì)它進(jìn)行設(shè)置。如果ar的值為p1的話,則將其設(shè)置為p2。

最后,獲取ar對(duì)應(yīng)的對(duì)象,并打印結(jié)果。p3.equals(p1)的結(jié)果為false,這是因?yàn)镻erson并沒(méi)有覆蓋equals()方法,而是采用繼承自O(shè)bject.java的equals()方法;而Object.java中的equals()實(shí)際上是調(diào)用"=="去比較兩個(gè)對(duì)象,即比較兩個(gè)對(duì)象的地址是否相等。

相關(guān)文章

  • Commons beanutils組件簡(jiǎn)介

    Commons beanutils組件簡(jiǎn)介

    這篇文章主要介紹了commons beanutils組件的相關(guān)內(nèi)容,以及部分實(shí)例和基本用法,需要的朋友可以參考下
    2017-09-09
  • java使用FileVisitor遍歷文件和目錄

    java使用FileVisitor遍歷文件和目錄

    這篇文章主要為大家詳細(xì)介紹了java使用FileVisitor遍歷文件和目錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Spring Boot中數(shù)據(jù)庫(kù)操作Druid和HikariDataSource的詳細(xì)過(guò)程

    Spring Boot中數(shù)據(jù)庫(kù)操作Druid和HikariDataSource的詳細(xì)過(guò)程

    這篇文章主要介紹了Spring Boot中數(shù)據(jù)庫(kù)操作Druid和HikariDataSource的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • maven私服搭建與使用教程

    maven私服搭建與使用教程

    在使用maven進(jìn)行Java項(xiàng)目的開(kāi)發(fā)過(guò)程中,難免會(huì)有些公共的私有庫(kù),這些庫(kù)是不太方便放到中央倉(cāng)庫(kù)的,可以通過(guò)Nexus搭建一個(gè)私有倉(cāng)庫(kù),這篇文章主要介紹了maven私服搭建與使用,需要的朋友可以參考下
    2023-03-03
  • Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟

    Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • intellij idea tomcat熱部署配置教程

    intellij idea tomcat熱部署配置教程

    這篇文章主要介紹了intellij idea tomcat熱部署配置教程圖解,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • mybatis-plus的自動(dòng)填充時(shí)間的問(wèn)題(添加到數(shù)據(jù)庫(kù)的時(shí)間比當(dāng)前時(shí)間多4個(gè)小時(shí))

    mybatis-plus的自動(dòng)填充時(shí)間的問(wèn)題(添加到數(shù)據(jù)庫(kù)的時(shí)間比當(dāng)前時(shí)間多4個(gè)小時(shí))

    這篇文章主要介紹了mybatis-plus的自動(dòng)填充時(shí)間的問(wèn)題(添加到數(shù)據(jù)庫(kù)的時(shí)間比當(dāng)前時(shí)間多4個(gè)小時(shí)),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java Vector和ArrayList的異同分析及實(shí)例講解

    Java Vector和ArrayList的異同分析及實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于Java Vector和ArrayList的異同分析及實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-01-01
  • MybatisPlus lambdaQueryWrapper中常用方法的使用

    MybatisPlus lambdaQueryWrapper中常用方法的使用

    本文主要介紹了MybatisPlus lambdaQueryWrapper中常用方法的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • KafkaListener注解的實(shí)現(xiàn)機(jī)制源碼解析

    KafkaListener注解的實(shí)現(xiàn)機(jī)制源碼解析

    這篇文章主要為大家介紹了KafkaListener注解的實(shí)現(xiàn)機(jī)制源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評(píng)論

宣威市| 柏乡县| 普兰店市| 玛多县| 区。| 信阳市| 章丘市| 韶关市| 拉萨市| 沙洋县| 婺源县| 瑞安市| 清水河县| 洛隆县| 铜川市| 彝良县| 天等县| 阿鲁科尔沁旗| 清丰县| 黄大仙区| 永平县| 河间市| 宜章县| 永平县| 怀来县| 兴城市| 巢湖市| 武冈市| 洪雅县| 伊宁县| 吉木萨尔县| 威宁| 南涧| 延边| 禄劝| 玛纳斯县| 沭阳县| 新密市| 佛坪县| 霍城县| 腾冲县|