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

全面了解Java中的CAS機制

 更新時間:2017年10月09日 09:53:44   作者:HankingHu  
下面小編就為大家?guī)硪黄媪私釰ava中的CAS機制。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

在看到Java鎖機制的時候,無意中看到了CAS這個詞,然后在百度查找CAS看了很多文章始終沒有看的太懂,今天又在Google上查找了一些資料,才算是真正弄清楚了CAS機制。

什么是CAS

在jdk 1.5中增加的一個最主要的支持是Atomic類,比如說AtomicInteger, AtomicLong,這些類可幫助最大限度地減少在多線程中對于一些基本操作(例如,增加或減少多個線程之間共享的值)的復雜性。而這些類的實現(xiàn)都依賴于CAS(compare and swap)的算法。

樂觀鎖和悲觀鎖

cpu是時分復用的,也就是把cpu的時間片,分配給不同的thread/process輪流執(zhí)行,時間片與時間片之間,需要進行cpu切換,也就是會發(fā)生進程的切換。切換涉及到清空寄存器,緩存數(shù)據(jù)。然后重新加載新的thread所需數(shù)據(jù)。當一個線程被掛起時,加入到阻塞隊列,在一定的時間或條件下,在通過notify(),notifyAll()喚醒回來。在某個資源不可用的時候,就將cpu讓出,把當前等待線程切換為阻塞狀態(tài)。等到資源(比如一個共享數(shù)據(jù))可用了,那么就將線程喚醒,讓他進入runnable狀態(tài)等待cpu調度。這就是典型的悲觀鎖的實現(xiàn)。獨占鎖是一種悲觀鎖,synchronized就是一種獨占鎖,它假設最壞的情況,并且只有在確保其它線程不會造成干擾的情況下執(zhí)行,會導致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。

但是,由于在進程掛起和恢復執(zhí)行過程中存在著很大的開銷。當一個線程正在等待鎖時,它不能做任何事,所以悲觀鎖有很大的缺點。舉個例子,如果一個線程需要某個資源,但是這個資源的占用時間很短,當線程第一次搶占這個資源時,可能這個資源被占用,如果此時掛起這個線程,可能立刻就發(fā)現(xiàn)資源可用,然后又需要花費很長的時間重新?lián)屨兼i,時間代價就會非常的高。

樂觀鎖思路就是,每次不加鎖而是假設沒有沖突而去完成某項操作,如果因為沖突失敗就重試,直到成功為止。某個線程可以不讓出cpu,而是一直while循環(huán),如果失敗就重試,直到成功為止。所以,當數(shù)據(jù)爭用不嚴重時,樂觀鎖效果更好。比如CAS就是一種樂觀鎖思想的應用。

CAS(Compare and Swap )算法

CAS中有三個核心參數(shù):

1.主內存中存放的V值,所有線程共享。

2.線程上次從內存中讀取的V值A存放在線程的幀棧中,每個線程私有。

3.需要寫入內存中并改寫V值的B值。也就是線程對A值操作后放入到主存V中。

上面說的比較抽象,看下面的這幅圖比較容易理解。

如上圖中,主存中保存V值,線程中要使用V值要先從主存中讀取V值到線程的工作內存A中,然后計算后變成B值,最后再把B值寫回到內存V值中。多個線程共用V值都是如此操作。CAS的核心是在將B值寫入到V之前要比較A值和V值是否相同,如果不相同證明此時V值已經(jīng)被其他線程改變,重新將V值賦給A,并重新計算得到B,如果相同,則將B值賦給V。

如果不使用CAS機制,看看存在什么問題,假如V=1,現(xiàn)在Thread1要對V進行加1,Thread2也要對V進行加1,首先Thread1讀取V=1到自己工作內存A中此時A=1,假設Thread2此時也讀取V=1到自己的工作內存A中,分別進行加1操作后,兩個線程中B的值都為2,此時寫回到V中時發(fā)現(xiàn)V的值為2,但是兩個線程分別對V進行加處理結果卻只加了1有問題。

CAS核心代碼

if (A==V)
{
  V = B
  return B;
}  
 else
  return V;

上面的操作是原子操作,現(xiàn)在來看看如果兩個線程同時要對V進行加1操作使用上面的CAS機制后能不能獲得正確結果。

①Thread 1和Thread2 要對V進行加1,Thread1和Thread2同時讀取v值并且對V執(zhí)行加1操作。

初始值 v=1,A=0, B=0。

②假設Thread1,Thread 2先讀取V值賦給A,并且對A進行加1,得到B=2。

V=1,T1_A=1,T1_B=2;T2_A=1

Thread1要將T1_B寫入V中,先要執(zhí)行CAS操作:

if (T1_A==V)
{
  V = T1_B
  return T1_B;
}  
 else
  return V;

因為T1_A=1=V,所以執(zhí)行 V=T1_B=2,此時V=2。

③Thread2也要對V執(zhí)行加操作。執(zhí)行加操作之后

V=2 ,T2_A=1,T2_B=2,

當Thread2要將T2_B值寫要V中之前要執(zhí)行CAS操作,

if (T2_A==V)
{
  V = T2_B
  return T2_B;
}  
 else
  return V;

此時T2_A=1,V=2, T2_A!=V,這時候返回V=2,給T2_A,T2_A=V=2,然后再次對T2_A進行加1,得到T2_B,此時T2_B=3,T2_A=2,比較T2_A==V,所以將T2_B的值賦給T2_V,T2_V=T2_B=3。最后結果為3。正確。

CAS中的ABA問題

如果一開始位置V得到的舊值是A,當進行賦值操作時再次讀取發(fā)現(xiàn)仍然是A,并不能說明變量沒有被其它線程改變過。有可能是其它線程將變量改為了B,后來又改回了A。大部分情況下ABA問題不會影響程序并發(fā)的正確性,如果要解決ABA問題,用傳統(tǒng)的互斥同步可能比原子類更高效。

ABA問題的解決辦法

1.在變量前面追加版本號:每次變量更新就把版本號加1,則A-B-A就變成1A-2B-3A。

2.atomic包下的AtomicStampedReference類:其compareAndSet方法首先檢查當前引用是否等于預期引用,并且當前標志是否等于預期標志,如果全部相等,則以原子方式將該引用的該標志的值設置為給定的更新值。

以上這篇全面了解Java中的CAS機制就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 關于JSCH使用自定義連接池的說明

    關于JSCH使用自定義連接池的說明

    這篇文章主要介紹了關于JSCH使用自定義連接池的說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java制作驗證碼的完整實例代碼

    Java制作驗證碼的完整實例代碼

    這篇文章主要給大家介紹了關于Java制作驗證碼的完整實例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • java list集合排序按某一屬性排序操作

    java list集合排序按某一屬性排序操作

    這篇文章主要介紹了java list集合排序按某一屬性排序操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java中SpringCloud的五大組件詳解

    Java中SpringCloud的五大組件詳解

    這篇文章主要介紹了Java中SpringCloud的五大組件詳解,Spring cloud是一個基于Spring Boot實現(xiàn)的服務治理工具包,在微服務架構中用于管理和協(xié)調服務,需要的朋友可以參考下
    2023-07-07
  • Java實現(xiàn)商城訂單超時取消功能

    Java實現(xiàn)商城訂單超時取消功能

    大多數(shù)的B2C商城項目都會有限時活動,當用戶下單后都會有支付超時時間,當訂單超時后訂單的狀態(tài)就會自動變成已取消 ,這個功能的實現(xiàn)有很多種方法,本文的實現(xiàn)方法適合大多數(shù)比較小的商城使用。具體實現(xiàn)方式可以跟隨小編一起看看吧
    2019-12-12
  • java8 stream多字段排序的實現(xiàn)

    java8 stream多字段排序的實現(xiàn)

    這篇文章主要介紹了java8 stream多字段排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Java并行執(zhí)行任務的幾種方案小結

    Java并行執(zhí)行任務的幾種方案小結

    這篇文章主要介紹了Java并行執(zhí)行任務的幾種方案小結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 深入理解Java并發(fā)編程之LinkedBlockingQueue隊列

    深入理解Java并發(fā)編程之LinkedBlockingQueue隊列

    本文主要介紹了Java并發(fā)編程之LinkedBlockingQueue隊列,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • Java截取url參數(shù)的方法

    Java截取url參數(shù)的方法

    本文給大家?guī)砹薺ava截取url參數(shù),url值得方法,代碼簡單易懂,非常不錯,具有參考借鑒價值,感興趣的朋友一起學習吧
    2016-08-08
  • Java實現(xiàn)解數(shù)獨的小程序

    Java實現(xiàn)解數(shù)獨的小程序

    最近在學習Java,然后上個月迷上了九宮格數(shù)獨,玩了幾天,覺得實在有趣,就想著能不能用編程來解決,于是就自己寫了個,還真解決了。下面這篇文章就給大家主要介紹了Java實現(xiàn)解數(shù)獨的小程序,需要的朋友可以參考借鑒。
    2017-01-01

最新評論

巢湖市| 平乐县| 白朗县| 靖安县| 克山县| 江陵县| 长海县| 民权县| 津南区| 巨野县| 金昌市| 昌黎县| 岳西县| 获嘉县| 博爱县| 舒城县| 唐山市| 集安市| 开阳县| 红河县| 娄底市| 蓬安县| 阆中市| 闽侯县| 岑溪市| 阜阳市| 呼图壁县| 新竹县| 青海省| 神木县| 林口县| 河间市| 宜君县| 绿春县| 大洼县| 和田县| 方城县| 云和县| 中西区| 荃湾区| 东乌珠穆沁旗|