日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
全面了解Java中的CAS機制-創(chuàng)新互聯(lián)

前言

成都創(chuàng)新互聯(lián)公司不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都網(wǎng)站制作、網(wǎng)站建設(shè)質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認(rèn)可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式全網(wǎng)營銷推廣需求,讓再小的成都品牌網(wǎng)站建設(shè)也能產(chǎn)生價值!

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

什么是CAS

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

樂觀鎖和悲觀鎖

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

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

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

CAS(Compare and Swap )算法

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

1.主內(nèi)存中存放的V值,所有線程共享。

2.線程上次從內(nèi)存中讀取的V值A(chǔ)存放在線程的幀棧中,每個線程私有。

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

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

全面了解Java中的CAS機制

如上圖中,主存中保存V值,線程中要使用V值要先從主存中讀取V值到線程的工作內(nèi)存A中,然后計算后變成B值,最后再把B值寫回到內(nèi)存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到自己工作內(nèi)存A中此時A=1,假設(shè)Thread2此時也讀取V=1到自己的工作內(nèi)存A中,分別進行加1操作后,兩個線程中B的值都為2,此時寫回到V中時發(fā)現(xiàn)V的值為2,但是兩個線程分別對V進行加處理結(jié)果卻只加了1有問題。

CAS核心代碼

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

新聞名稱:全面了解Java中的CAS機制-創(chuàng)新互聯(lián)
文章路徑:http://www.dlmjj.cn/article/ihodj.html