中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

專(zhuān)業(yè)建設(shè)網(wǎng)站公司哪家好/優(yōu)化深圳seo

專(zhuān)業(yè)建設(shè)網(wǎng)站公司哪家好,優(yōu)化深圳seo,安全生產(chǎn)門(mén)戶(hù)網(wǎng)站建設(shè),網(wǎng)站做產(chǎn)品的審核CAS這個(gè)機(jī)制就給實(shí)現(xiàn)線(xiàn)程安全版本的代碼,提供了一個(gè)新的思路,之前通過(guò)加鎖,把多個(gè)指令打包成整體,來(lái)實(shí)現(xiàn)線(xiàn)程安全?,F(xiàn)在就可以考慮直接基與CAS來(lái)實(shí)現(xiàn)一些修改操作,也能保證線(xiàn)程安全(不需要加鎖)…

CAS這個(gè)機(jī)制就給實(shí)現(xiàn)線(xiàn)程安全版本的代碼,提供了一個(gè)新的思路,之前通過(guò)加鎖,把多個(gè)指令打包成整體,來(lái)實(shí)現(xiàn)線(xiàn)程安全?,F(xiàn)在就可以考慮直接基與CAS來(lái)實(shí)現(xiàn)一些修改操作,也能保證線(xiàn)程安全(不需要加鎖)

1.什么是 CAS

CAS: 全稱(chēng)Compare and swap,字面意思:”比較并交換“,一個(gè) CAS 涉及到以下操作:

我們假設(shè)內(nèi)存中的原數(shù)據(jù)V,舊的預(yù)期值A(chǔ),需要修改的新值B。
1. 比較 A 與 V 是否相等。(比較)
2. 如果比較相等,將 B 寫(xiě)入 V。(交換)
3. 返回操作是否成功。

CAS 偽代碼

下面寫(xiě)的代碼不是原子的, 真實(shí)的 CAS 是一個(gè)原子的硬件指令完成的. 這個(gè)偽代碼只是輔助理解
CAS 的工作流程.

    boolean CAS(address, expectValue, swapValue) {if (&address == expectedValue){&address = swapValue;return true;}return false;}

當(dāng)多個(gè)線(xiàn)程同時(shí)對(duì)某個(gè)資源進(jìn)行CAS操作,只能有一個(gè)線(xiàn)程操作成功,但是并不會(huì)阻塞其他線(xiàn)程,其他線(xiàn)程只會(huì)收到操作失敗的信號(hào).

CAS 可以視為是一種樂(lè)觀鎖. (或者可以理解成 CAS 是樂(lè)觀鎖的一種實(shí)現(xiàn)方式)
?

2.CAS 是怎么實(shí)現(xiàn)

針對(duì)不同的操作系統(tǒng),JVM 用到了不同的 CAS 實(shí)現(xiàn)原理,簡(jiǎn)單來(lái)講:

  • java 的 CAS 利用的的是 unsafe 這個(gè)類(lèi)提供的 CAS 操作;
  • unsafe 的 CAS 依賴(lài)了的是 jvm 針對(duì)不同的操作系統(tǒng)實(shí)現(xiàn)的 Atomic::cmpxchg;
  • Atomic::cmpxchg 的實(shí)現(xiàn)使用了匯編的 CAS 操作,并使用 cpu 硬件提供的 lock 機(jī)制保證其原子性

簡(jiǎn)而言之,是因?yàn)橛布枰粤酥С?#xff0c;軟件層面才能做到.
?

3.CAS 有哪些應(yīng)用

(1)實(shí)現(xiàn)原子類(lèi)

標(biāo)準(zhǔn)庫(kù)中提供了 java.util.concurrent.atomic 包, 里面的類(lèi)都是基于這種方式來(lái)實(shí)現(xiàn)的.
典型的就是 AtomicInteger 類(lèi). 其中的 getAndIncrement 相當(dāng)于 i++ 操作.
?

package thread2;import java.util.concurrent.atomic.AtomicInteger;public class Test7 {private static AtomicInteger num = new AtomicInteger(0);public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(() -> {for (int i = 0; i < 50000; i++) {num.getAndIncrement();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 50000; i++) {num.getAndIncrement();}});thread1.start();thread2.start();thread1.join();thread2.join();System.out.println(num.get());}}

?

不會(huì)出現(xiàn)線(xiàn)程安全問(wèn)題!

偽代碼實(shí)現(xiàn)getAndIncrement:

class AtomicInteger {private int value;public int getAndIncrement() {int oldValue = value;while (CAS(value, oldValue, oldValue + 1) != true) {oldValue = value;}return oldValue;}
}

假設(shè)兩個(gè)線(xiàn)程同時(shí)調(diào)用 getAndIncrement

(1)兩個(gè)線(xiàn)程都讀取 value 的值到 oldValue 中. (oldValue 是一個(gè)局部變量, 在棧上. 每個(gè)線(xiàn)程有自己的棧)

?

?(2)?線(xiàn)程1 先執(zhí)行 CAS 操作. 由于 oldValue 和 value 的值相同, 直接進(jìn)行對(duì) value 賦值.

  • CAS 是直接讀寫(xiě)內(nèi)存的, 而不是操作寄存器.
  • CAS 的讀內(nèi)存, 比較, 寫(xiě)內(nèi)存操作是一條硬件指令, 是原子的.
    ?

(3)?線(xiàn)程2 再執(zhí)行 CAS 操作, 第一次 CAS 的時(shí)候發(fā)現(xiàn) oldValue 和 value 不相等, 不能進(jìn)行賦值. 因此需要進(jìn)入循環(huán).在循環(huán)里重新讀取 value 的值賦給 oldValue


?

(4)線(xiàn)程2 接下來(lái)第二次執(zhí)行 CAS, 此時(shí) oldValue 和 value 相同, 于是直接執(zhí)行賦值操作.


?

(5) 線(xiàn)程1 和 線(xiàn)程2 返回各自的 oldValue 的值即可.

通過(guò)形如上述代碼就可以實(shí)現(xiàn)一個(gè)原子類(lèi). 不需要使用重量級(jí)鎖, 就可以高效的完成多線(xiàn)程的自增操作.

本來(lái) check and set 這樣的操作在代碼角度不是原子的. 但是在硬件層面上可以讓一條指令完成這
個(gè)操作, 也就變成原子的了.

(2)實(shí)現(xiàn)自旋鎖

基于 CAS 實(shí)現(xiàn)更靈活的鎖, 獲取到更多的控制權(quán)

public class SpinLock {private Thread owner = null;public void lock() {
// 通過(guò) CAS 看當(dāng)前鎖是否被某個(gè)線(xiàn)程持有.
// 如果這個(gè)鎖已經(jīng)被別的線(xiàn)程持有, 那么就自旋等待.
// 如果這個(gè)鎖沒(méi)有被別的線(xiàn)程持有, 那么就把 owner 設(shè)為當(dāng)前嘗試加鎖的線(xiàn)程.while (!CAS(this.owner, null, Thread.currentThread())) {}}public void unlock() {this.owner = null;}
}

通過(guò)CAS,比較一下, owner是不是null (問(wèn)問(wèn)這個(gè)鎖,是不是空閑的,沒(méi)人用的)
如果是空閑的,就直接把當(dāng)前線(xiàn)程的值,賦值給這里owner就相當(dāng)于表示了當(dāng)前的鎖被這個(gè)線(xiàn)程給獲取到了~~
如果當(dāng)前鎖不是空閑的,此處CAS的比較就會(huì)失敗,直接返回false,循環(huán)繼續(xù)再進(jìn)行一次再重復(fù)上述的CAS過(guò)程~
直到owner為 null,這個(gè)循環(huán)CAS操作比較交換成功,才能從lock方法中返回~~
自旋鎖的特點(diǎn),就是在其他線(xiàn)程釋放了鎖的瞬間,就能感知到,并且獲取到鎖~~

4.CAS 的 ABA 問(wèn)題

假設(shè)存在兩個(gè)線(xiàn)程 t1 和 t2. 有一個(gè)共享變量 num, 初始值為 A.接下來(lái), 線(xiàn)程 t1 想使用 CAS 把 num 值改成 Z, 那么就需要

  • 先讀取 num 的值, 記錄到 oldNum 變量中.
  • 使用 CAS 判定當(dāng)前 num 的值是否為 A, 如果為 A, 就修改成 Z

但是, 在 t1 執(zhí)行這兩個(gè)操作之間, t2 線(xiàn)程可能把 num 的值從 A 改成了 B, 又從 B 改成了 A

線(xiàn)程 t1 的 CAS 是期望 num 不變就修改. 但是 num 的值已經(jīng)被 t2 給改了. 只不過(guò)又改成 A 了. 這個(gè)時(shí)候 t1 究竟是否要更新 num 的值為 Z 呢?

到這一步, t1 線(xiàn)程無(wú)法區(qū)分當(dāng)前這個(gè)變量始終是 A, 還是經(jīng)歷了一個(gè)變化過(guò)程.

ABA 問(wèn)題引來(lái)的 BUG

大部分的情況下, t2 線(xiàn)程這樣的一個(gè)反復(fù)橫跳改動(dòng), 對(duì)于 t1 是否修改 num 是沒(méi)有影響的. 但是不排除一些特殊情況

假設(shè) 滑稽老哥 有 100 存款. 滑稽想從 ATM 取 50 塊錢(qián). 取款機(jī)創(chuàng)建了兩個(gè)線(xiàn)程, 并發(fā)的來(lái)執(zhí)行 -50
操作.我們期望一個(gè)線(xiàn)程執(zhí)行 -50 成功, 另一個(gè)線(xiàn)程 -50 失敗.如果使用 CAS 的方式來(lái)完成這個(gè)扣款過(guò)程就可能出現(xiàn)問(wèn)題.

正常的過(guò)程

  1. 存款 100. 線(xiàn)程1 獲取到當(dāng)前存款值為 100, 期望更新為 50; 線(xiàn)程2 獲取到當(dāng)前存款值為 100, 期望更新為 50.
  2. 線(xiàn)程1 執(zhí)行扣款成功, 存款被改成 50. 線(xiàn)程2 阻塞等待中.
  3. 輪到線(xiàn)程2 執(zhí)行了, 發(fā)現(xiàn)當(dāng)前存款為 50, 和之前讀到的 100 不相同, 執(zhí)行失敗.

異常的過(guò)程

  1. 存款 100. 線(xiàn)程1 獲取到當(dāng)前存款值為 100, 期望更新為 50; 線(xiàn)程2 獲取到當(dāng)前存款值為 100, 期望更新為 50.
  2. 線(xiàn)程1 執(zhí)行扣款成功, 存款被改成 50. 線(xiàn)程2 阻塞等待中.
  3. 在線(xiàn)程2 執(zhí)行之前, 滑稽的朋友正好給滑稽轉(zhuǎn)賬 50, 賬戶(hù)余額變成 100 !!
  4. 輪到線(xiàn)程2 執(zhí)行了, 發(fā)現(xiàn)當(dāng)前存款為 100, 和之前讀到的 100 相同, 再次執(zhí)行扣款操作這個(gè)時(shí)候, 扣款操作被執(zhí)行了兩次!!! 都是 ABA 問(wèn)題搞的鬼

解決方案

給要修改的值, 引入版本號(hào). 在 CAS 比較數(shù)據(jù)當(dāng)前值和舊值的同時(shí), 也要比較版本號(hào)是否符合預(yù)期.

  • CAS 操作在讀取舊值的同時(shí), 也要讀取版本號(hào)

真正修改的時(shí)候,

  • 如果當(dāng)前版本號(hào)和讀到的版本號(hào)相同, 則修改數(shù)據(jù), 并把版本號(hào) + 1.
  • 如果當(dāng)前版本號(hào)高于讀到的版本號(hào). 就操作失敗(認(rèn)為數(shù)據(jù)已經(jīng)被修改過(guò)了).
    ?

對(duì)比理解上面的轉(zhuǎn)賬例子

假設(shè) 滑稽老哥 有 100 存款. 滑稽想從 ATM 取 50 塊錢(qián). 取款機(jī)創(chuàng)建了兩個(gè)線(xiàn)程, 并發(fā)的來(lái)執(zhí)行 -50
操作.
我們期望一個(gè)線(xiàn)程執(zhí)行 -50 成功, 另一個(gè)線(xiàn)程 -50 失敗.
為了解決 ABA 問(wèn)題, 給余額搭配一個(gè)版本號(hào), 初始設(shè)為 1.
1.存款 100. 線(xiàn)程1 獲取到 存款值為 100, 版本號(hào)為 1, 期望更新為 50; 線(xiàn)程2 獲取到存款值為 100,
版本號(hào)為 1, 期望更新為 50.


2.線(xiàn)程1 執(zhí)行扣款成功, 存款被改成 50, 版本號(hào)改為2. 線(xiàn)程2 阻塞等待中.


3.在線(xiàn)程2 執(zhí)行之前, 滑稽的朋友正好給滑稽轉(zhuǎn)賬 50, 賬戶(hù)余額變成 100, 版本號(hào)變成3.


4.輪到線(xiàn)程2 執(zhí)行了, 發(fā)現(xiàn)當(dāng)前存款為 100, 和之前讀到的 100 相同, 但是當(dāng)前版本號(hào)為 3, 之前讀
到的版本號(hào)為 1, 版本小于當(dāng)前版本, 認(rèn)為操作失敗.

都版本不一樣了咋辦?線(xiàn)程一是version=2,線(xiàn)程2是version=1,都讀取失敗,重新從內(nèi)存讀取至版本和值。?

在 Java 標(biāo)準(zhǔn)庫(kù)中提供了 AtomicStampedReference<E> 類(lèi). 這個(gè)類(lèi)可以對(duì)某個(gè)類(lèi)進(jìn)行包裝, 在內(nèi)部就提供了上面描述的版本管理功能.
?

1) 講解下你自己理解的 CAS 機(jī)制

全稱(chēng) Compare and swap, 即 "比較并交換". 相當(dāng)于通過(guò)一個(gè)原子的操作, 同時(shí)完成 "讀取內(nèi)存, 比
較是否相等, 修改內(nèi)存" 這三個(gè)步驟. 本質(zhì)上需要 CPU 指令的支撐.

2) ABA問(wèn)題怎么解決?

給要修改的數(shù)據(jù)引入版本號(hào). 在 CAS 比較數(shù)據(jù)當(dāng)前值和舊值的同時(shí), 也要比較版本號(hào)是否符合預(yù)期.
如果發(fā)現(xiàn)當(dāng)前版本號(hào)和之前讀到的版本號(hào)一致, 就真正執(zhí)行修改操作, 并讓版本號(hào)自增; 如果發(fā)現(xiàn)當(dāng)
前版本號(hào)比之前讀到的版本號(hào)大, 就認(rèn)為操作失敗


?

http://www.risenshineclean.com/news/101.html

相關(guān)文章:

  • 企業(yè)網(wǎng)站服務(wù)器選擇/torrentkitty磁力官網(wǎng)
  • 石獅市網(wǎng)站建設(shè)/seo 頁(yè)面鏈接優(yōu)化
  • 上海網(wǎng)站排名團(tuán)隊(duì)/百度搜索引擎的網(wǎng)址是
  • ds216j做網(wǎng)站/跨境電商培訓(xùn)
  • 微網(wǎng)站 pc網(wǎng)站同步/長(zhǎng)沙靠譜關(guān)鍵詞優(yōu)化公司電話(huà)
  • 人設(shè)生成器網(wǎng)站/怎么把平臺(tái)推廣出去
  • 溧陽(yáng)手機(jī)網(wǎng)站哪里做/學(xué)it什么培訓(xùn)機(jī)構(gòu)好
  • 找人網(wǎng)站/網(wǎng)頁(yè)模板怎么用
  • 揭陽(yáng)網(wǎng)站制作案例/如何在各種網(wǎng)站投放廣告
  • 網(wǎng)站免費(fèi)正能量入口/百度首頁(yè)推薦關(guān)不掉嗎
  • 網(wǎng)站建設(shè)步驟及分工/優(yōu)秀軟文范例100字
  • 對(duì)網(wǎng)站進(jìn)行優(yōu)化/網(wǎng)站排名快速提升
  • 武城網(wǎng)站建設(shè)費(fèi)用/品牌營(yíng)銷(xiāo)公司
  • 佛山市企業(yè)網(wǎng)站建設(shè)平臺(tái)/太原關(guān)鍵詞優(yōu)化軟件
  • 做網(wǎng)站大概價(jià)格/南昌seo排名優(yōu)化
  • 做網(wǎng)站的公司有前途嗎/如何制作網(wǎng)站和網(wǎng)頁(yè)
  • 免費(fèi)建站的站點(diǎn)網(wǎng)站/游戲推廣是什么工作
  • 無(wú)錫企業(yè)網(wǎng)站seo/百度廣告投訴電話(huà)
  • 網(wǎng)站代碼怎么改/個(gè)人在線(xiàn)做網(wǎng)站免費(fèi)
  • 網(wǎng)站首頁(yè)html/怎樣打百度人工客服熱線(xiàn)
  • 深圳市企業(yè)網(wǎng)站建設(shè)價(jià)格/整合營(yíng)銷(xiāo)理論主要是指
  • 個(gè)人主頁(yè)頁(yè)面/seo優(yōu)化招商
  • 工信部網(wǎng)站備案查詢(xún)步驟詳解/公司網(wǎng)站
  • 做航模的網(wǎng)站/網(wǎng)銷(xiāo)怎么做
  • 網(wǎng)站pv統(tǒng)計(jì)方法/推廣策劃方案
  • tornado 做網(wǎng)站/seo刷詞工具在線(xiàn)
  • 網(wǎng)站建設(shè)和維護(hù)合同/湖南seo優(yōu)化首選
  • 淘寶網(wǎng)站建設(shè)哪個(gè)類(lèi)目/seo公司
  • 做網(wǎng)站怎么偷源碼做網(wǎng)站/阿里seo排名優(yōu)化軟件
  • 電商網(wǎng)站建設(shè)與運(yùn)營(yíng)/網(wǎng)站管理