一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語(yǔ)言|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Java并發(fā)的CAS原理與ABA問(wèn)題的講解

Java并發(fā)的CAS原理與ABA問(wèn)題的講解

2021-07-13 15:17JimmyU1 Java教程

今天小編就為大家分享一篇關(guān)于Java并發(fā)的CAS原理與ABA問(wèn)題的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

cas原理

在計(jì)算機(jī)科學(xué)中,比較和交換(compare and swap)是用于實(shí)現(xiàn)多線程同步的原子指令。 它將內(nèi)存位置的內(nèi)容與給定值進(jìn)行比較,只有在相同的情況下,將該內(nèi)存位置的內(nèi)容修改為新的給定值。 這是作為單個(gè)原子操作完成的。 原子性保證新值基于最新信息計(jì)算; 如果該值在同一時(shí)間被另一個(gè)線程更新,則寫(xiě)入將失敗。 操作結(jié)果必須說(shuō)明是否進(jìn)行替換; 這可以通過(guò)一個(gè)簡(jiǎn)單的布爾響應(yīng)(這個(gè)變體通常稱(chēng)為比較和設(shè)置),或通過(guò)返回從內(nèi)存位置讀取的值來(lái)完成(摘自維基本科)

cas流程

Java并發(fā)的CAS原理與ABA問(wèn)題的講解

以atomicinteger.addandget()為例講解cas

javadoc

public final int addandget?(int delta)
atomically adds the given value to the current value, with memory effects as specified by varhandle.getandadd(java.lang.object…).
parameters:
delta - the value to add
returns:
the updated value

在java的源碼中

?
1
2
3
public final int addandget(int delta) {
  return u.getandaddint(this, value, delta) + delta;
}

這里的value是在該類(lèi)初始化的時(shí)候獲取到的,理解一下就是這時(shí)候我們調(diào)用unsafe的objectfieldoffset從atomic類(lèi)文件中獲取value的偏移量,那么value其實(shí)就是記錄value的偏移量的。

value準(zhǔn)確的是value這個(gè)字段相對(duì)與atomicinteger這個(gè)對(duì)象內(nèi)存起始地址的偏移量,由于這個(gè)方法的最底層是jni調(diào)用native的方法,所以需要傳入這個(gè)值。

?
1
private static final long value = u.objectfieldoffset(atomicinteger.class, "value");

繼續(xù)往下執(zhí)行:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * atomically adds the given value to the current value of a field
 * or array element within the given object {@code o}
 * at the given {@code offset}.
 * @param o object/array to update the field/element in
 * @param offset field/element offset
 * @param delta the value to add
 * @return the previous value
 * @since 1.8
 **/
@hotspotintrinsiccandidate
public final int getandaddint(object o, long offset, int delta) {
  int v;
  do {
    v = getintvolatile(o, offset);
  } while (!weakcompareandsetint(o, offset, v, v + delta));
  return v;
}
?
1
2
3
4
5
6
@hotspotintrinsiccandidate
public final boolean weakcompareandsetint(object o, long offset,
                     int expected,
                     int x) {
  return compareandsetint(o, offset, expected, x);
}

如果obj內(nèi)的value和expect相等,就證明沒(méi)有其他線程改變過(guò)這個(gè)變量,那么就更新它為update,如果這一步的cas沒(méi)有成功,那就采用自旋的方式繼續(xù)進(jìn)行cas操作。從代碼中看著也是兩個(gè)步驟,但其實(shí)在jni里是借助于一個(gè)cpu指令完成的,實(shí)際還是原子操作。

aba問(wèn)題

產(chǎn)生aba問(wèn)題的原因

cas需要在操作值的時(shí)候檢查下值有沒(méi)有發(fā)生變化,如果沒(méi)有發(fā)生變化則更新,但是如果一個(gè)值原來(lái)是a,變成了b,又變成了a,那么使用cas進(jìn)行檢查時(shí)會(huì)發(fā)現(xiàn)它的值沒(méi)有發(fā)生變化,但是實(shí)際上卻變化了。這就是cas的aba問(wèn)題。

如何規(guī)避aba問(wèn)題

常用的辦法是在更新數(shù)據(jù)的時(shí)候加入版本號(hào),以版本號(hào)來(lái)控制更新。

Java并發(fā)的CAS原理與ABA問(wèn)題的講解

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)服務(wù)器之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

原文鏈接:https://blog.csdn.net/u012449363/article/details/86549823

延伸 · 閱讀

精彩推薦
  • Java教程Java實(shí)現(xiàn)淘寶秒殺聚劃算搶購(gòu)自動(dòng)提醒源碼

    Java實(shí)現(xiàn)淘寶秒殺聚劃算搶購(gòu)自動(dòng)提醒源碼

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)淘寶秒殺聚劃算搶購(gòu)自動(dòng)提醒源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參...

    Techzero11192021-04-02
  • Java教程Java設(shè)計(jì)模式之Strategy模式

    Java設(shè)計(jì)模式之Strategy模式

    Strategy模式即策略模式,就是將一個(gè)算法的不同實(shí)現(xiàn)封裝成一個(gè)個(gè)單獨(dú)的類(lèi),這些類(lèi)實(shí)現(xiàn)同一個(gè)接口,使用者直接使用該接口來(lái)訪問(wèn)具體的算法。這個(gè)樣子...

    java教程網(wǎng)3822020-05-29
  • Java教程spring MVC + bootstrap實(shí)現(xiàn)文件上傳示例(帶進(jìn)度條)

    spring MVC + bootstrap實(shí)現(xiàn)文件上傳示例(帶進(jìn)度條)

    本篇文章主要介紹了spring MVC + bootstrap實(shí)現(xiàn)文件上傳示例(帶進(jìn)度條),非常具有使用價(jià)值,有需要的朋友可以了解一下。...

    公羽土成4822020-08-23
  • Java教程Java-JFrame-swing嵌套瀏覽器的具體步驟

    Java-JFrame-swing嵌套瀏覽器的具體步驟

    下面小編就為大家?guī)?lái)一篇Java-JFrame-swing嵌套瀏覽器的具體步驟。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧...

    lsyBlog3492021-01-23
  • Java教程spring boot + quartz集群搭建的完整步驟

    spring boot + quartz集群搭建的完整步驟

    這篇文章主要給大家介紹了關(guān)于spring boot + quartz集群搭建的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值...

    vincent_ren11772021-04-26
  • Java教程Java8中stream和functional interface的配合使用詳解

    Java8中stream和functional interface的配合使用詳解

    這篇文章主要給大家介紹了關(guān)于Java8中stream和functional interface配合使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java8具有一定的...

    Ming6982021-02-04
  • Java教程深入解析Java編程中final關(guān)鍵字的作用

    深入解析Java編程中final關(guān)鍵字的作用

    final關(guān)鍵字正如其字面意思一樣,意味著最后,比如被final修飾后類(lèi)不能集成、變量不能被再賦值等,以下我們就來(lái)深入解析Java編程中final關(guān)鍵字的作用: ...

    Ider1672020-05-17
  • Java教程Jenkins源代碼管理SVN實(shí)現(xiàn)步驟解析

    Jenkins源代碼管理SVN實(shí)現(xiàn)步驟解析

    這篇文章主要介紹了Jenkins源代碼管理SVN實(shí)現(xiàn)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以...

    多測(cè)師_鄭sir4962020-09-06
主站蜘蛛池模板: 欧美在线视频免费播放 | 国产亚洲精品91 | 天天爱天天做天天爽天天躁 | 视频免费视频观看网站 | 日日爽| 高h短篇辣肉各种姿势bl | 99久久99久久久精品齐齐鬼色 | 青青色综合 | 特级淫片大乳女子高清视频 | 免费看隐私美女 | 亚洲国产精品综合一区在线 | 国产高清亚洲 | 欧美日韩一区二区三区在线观看 | 午夜爱爱爱爱爽爽爽视频网站 | yellow高清免费观看日本 | 色婷婷激婷婷深爱五月老司机 | 久久免费看少妇高潮A片JA | 国产专区亚洲欧美另类在线 | 小小水蜜桃3视频在线观看 小鸟酱喷水 | 欧美骚熟 | 国产天天在线 | 成人欧美一区二区三区黑人 | 3d蒂法精品啪啪一区二区免费 | 美女翘臀内疯狂进出 | 久久www免费人成_看片高清 | 免费观看日本视频 | 日韩欧美不卡片 | 果冻传媒天美传媒网址入口 | 99精彩视频 | 啊哈用力cao我 | 爆操美女在线观看 | 女人把私密部位张开让男人桶 | 调教扩张宫颈女人惨叫 | ai换脸明星专区在线观看 | 久久艹综合 | chinese军人@gay| 风间由美在线播放 | 国产亚洲精品网站 | 波多野结衣中文字幕乱七八糟 | 涩涩国产精品福利在线观看 | 欧美在线一级视频 |