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

java并發(fā)編程之cas詳解

 更新時(shí)間:2017年11月03日 15:12:35   投稿:mengwei  
這篇文章主要介紹了java并發(fā)編程之cas詳解,涉及cas使用場(chǎng)景和cas用作原子操作等內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。

CAS(Compare and swap)比較和替換是設(shè)計(jì)并發(fā)算法時(shí)用到的一種技術(shù)。簡(jiǎn)單來(lái)說(shuō),比較和替換是使用一個(gè)期望值和一個(gè)變量的當(dāng)前值進(jìn)行比較,如果當(dāng)前變量的值與我們期望的值相等,就使用一個(gè)新值替換當(dāng)前變量的值。這聽(tīng)起來(lái)可能有一點(diǎn)復(fù)雜但是實(shí)際上你理解之后發(fā)現(xiàn)很簡(jiǎn)單,接下來(lái),讓我們跟深入的了解一下這項(xiàng)技術(shù)。

CAS的使用場(chǎng)景

在程序和算法中一個(gè)經(jīng)常出現(xiàn)的模式就是“check and act”模式。先檢查后操作模式發(fā)生在代碼中首先檢查一個(gè)變量的值,然后再基于這個(gè)值做一些操作。下面是一個(gè)簡(jiǎn)單的示例:

class MyLock {
  private boolean locked = false;
  public boolean lock() {
    if(!locked) {
      locked = true;
      return true;
    }
    return false;
  }
}

上面這段代碼,如果用在多線程的程序會(huì)出現(xiàn)很多錯(cuò)誤,不過(guò)現(xiàn)在請(qǐng)忘掉它。

如你所見(jiàn),lock()方法首先檢查locked>成員變量是否等于false,如果等于,就將locked設(shè)為true。

如果同個(gè)線程訪問(wèn)同一個(gè)MyLock實(shí)例,上面的lock()將不能保證正常工作。如果一個(gè)線程檢查locked的值,然后將其設(shè)置為false,與此同時(shí),一個(gè)線程B也在檢查locked的值,又或者,在線程A將locked的值設(shè)為false之前。因此,線程A和線程B可能都看到locked的值為false,然后兩者都基于這個(gè)信息做一些操作。

為了在一個(gè)多線程程序中良好的工作,”checkthenact”操作必須是原子的。原子就是說(shuō)”check“操作和”act“被當(dāng)做一個(gè)原子代碼塊執(zhí)行。不存在多個(gè)線程同時(shí)執(zhí)行原子塊。

下面是一個(gè)代碼示例,把之前的lock()方法用synchronized關(guān)鍵字重構(gòu)成一個(gè)原子塊。

class MyLock {
  private boolean locked = false;
  public synchronized boolean lock() {
    if(!locked) {
      locked = true;
      return true;
    }
    return false;
  }
}

現(xiàn)在lock()方法是同步的,所以,在某一時(shí)刻只能有一個(gè)線程在同一個(gè)MyLock實(shí)例上執(zhí)行它。

原子的lock方法實(shí)際上是一個(gè)”compare and swap“的例子。

CAS用作原子操作

現(xiàn)在CPU內(nèi)部已經(jīng)執(zhí)行原子的CAS操作。Java5以來(lái),你可以使用java.util.concurrent.atomic包中的一些原子類來(lái)使用CPU中的這些功能。

下面是一個(gè)使用AtomicBoolean類實(shí)現(xiàn)lock()方法的例子:

public static class MyLock {
  private AtomicBoolean locked = new AtomicBoolean(false);
  public boolean lock() {
    return locked.compareAndSet(false, true);
  }
}

locked變量不再是boolean類型而是AtomicBoolean。這個(gè)類中有一個(gè)compareAndSet()方法,它使用一個(gè)期望值和AtomicBoolean實(shí)例的值比較,和兩者相等,則使用一個(gè)新值替換原來(lái)的值。在這個(gè)例子中,它比較locked的值和false,如果locked的值為false,則把修改為true。

如果值被替換了,compareAndSet()返回true,否則,返回false。

使用Java5+提供的CAS特性而不是使用自己實(shí)現(xiàn)的的好處是Java5+中內(nèi)置的CAS特性可以讓你利用底層的你的程序所運(yùn)行機(jī)器的CPU的CAS特性。這會(huì)使還有CAS的代碼運(yùn)行更快。

總結(jié)

以上就是關(guān)于java并發(fā)編程之cas詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Java系統(tǒng)的高并發(fā)解決方法詳解、Java并發(fā)編程之重入鎖與讀寫鎖Java并發(fā)編程Semaphore計(jì)數(shù)信號(hào)量詳解等,有什么問(wèn)題可以隨時(shí)留言,歡迎您的寶貴意見(jiàn),小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • SpringBoot集成ActiveMQ的實(shí)戰(zhàn)全過(guò)程

    SpringBoot集成ActiveMQ的實(shí)戰(zhàn)全過(guò)程

    消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件,主要解決應(yīng)用耦合、異步消息、流量削鋒等問(wèn)題,實(shí)現(xiàn)高性能、高可用、可伸縮和最終一致性架構(gòu),是大型分布式系統(tǒng)不可缺少的中間件,這篇文章主要給大家介紹了關(guān)于SpringBoot集成ActiveMQ的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Java中的三種代理模式詳解

    Java中的三種代理模式詳解

    這篇文章主要介紹了Java中的三種代理模式詳解,代理模式的關(guān)鍵點(diǎn)是:代理對(duì)象與目標(biāo)對(duì)象.代理對(duì)象是對(duì)目標(biāo)對(duì)象的擴(kuò)展,并會(huì)調(diào)用目標(biāo)對(duì)象,文中提供了部分代碼,需要的朋友可以參考下
    2023-08-08
  • Java Web 實(shí)現(xiàn)QQ登錄功能一個(gè)帳號(hào)同一時(shí)間只能一個(gè)人登錄

    Java Web 實(shí)現(xiàn)QQ登錄功能一個(gè)帳號(hào)同一時(shí)間只能一個(gè)人登錄

    對(duì)于一個(gè)帳號(hào)在同一時(shí)間只能一個(gè)人登錄,下文給大家介紹的非常詳細(xì),對(duì)java web qq 登錄功能感興趣的朋友一起看看吧
    2016-11-11
  • 淺析fastjson2時(shí)間序列化和反序列化的簡(jiǎn)單使用

    淺析fastjson2時(shí)間序列化和反序列化的簡(jiǎn)單使用

    在項(xiàng)目中將fastjson升級(jí)為fastjson2后,我們遇到了一些與fastjson不完全兼容的問(wèn)題,所以本文就來(lái)探討下fastjson2的時(shí)間序列化和反序列化的簡(jiǎn)單使用吧
    2025-01-01
  • Springboot添加支付接口

    Springboot添加支付接口

    這篇文章主要介紹了springboot如何添加支付接口,幫助大家更好得理解和學(xué)習(xí)使用springboot框架,感興趣的朋友可以了解下
    2021-04-04
  • Java實(shí)現(xiàn)將數(shù)字日期翻譯成英文單詞的工具類實(shí)例

    Java實(shí)現(xiàn)將數(shù)字日期翻譯成英文單詞的工具類實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)將數(shù)字日期翻譯成英文單詞的工具類,結(jié)合完整實(shí)例形式分析了Java日期轉(zhuǎn)換與字符串操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • 基于mybatis注解動(dòng)態(tài)sql中foreach工具的方法

    基于mybatis注解動(dòng)態(tài)sql中foreach工具的方法

    這篇文章主要介紹了mybatis注解動(dòng)態(tài)sql中foreach工具方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring中自定義攔截器的使用

    Spring中自定義攔截器的使用

    大家好,本篇文章主要講的是Spring中自定義攔截器的使用,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Java中獲取文件大小的詳解及實(shí)例代碼

    Java中獲取文件大小的詳解及實(shí)例代碼

    這篇文章主要介紹了Java中獲取文件大小的詳解及實(shí)例代碼的相關(guān)資料,一種是使用File的length()方法,另外一種是使用FileInputStream的available()方法,這里就說(shuō)下如何使用需要的朋友可以參考下
    2016-12-12
  • 關(guān)于Java集合框架面試題(含答案)下

    關(guān)于Java集合框架面試題(含答案)下

    Java集合框架為Java編程語(yǔ)言的基礎(chǔ),也是Java面試中很重要的一個(gè)知識(shí)點(diǎn)。這里,我列出了一些關(guān)于Java集合的重要問(wèn)題和答案。
    2015-12-12

最新評(píng)論

冷水江市| 浠水县| 滁州市| 山阳县| 沂源县| 博湖县| 牡丹江市| 桦川县| 林西县| 大田县| 调兵山市| 伊川县| 三门县| 社会| 普安县| 攀枝花市| 南充市| 朝阳市| 元江| 贵港市| 铁力市| 江川县| 博白县| 河东区| 长葛市| 新源县| 荔波县| 内乡县| 军事| 诸城市| 塔城市| 盐城市| 遂宁市| 定边县| 桓台县| 忻城县| 额敏县| 阿勒泰市| 卫辉市| 华坪县| 若羌县|