這篇文章給大家分享的是有關java并發(fā)編程之cas的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
公司主營業(yè)務:成都網(wǎng)站設計、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出薩迦免費做網(wǎng)站回饋大家。
CAS(Compare and swap)比較和替換是設計并發(fā)算法時用到的一種技術。簡單來說,比較和替換是使用一個期望值和一個變量的當前值進行比較,如果當前變量的值與我們期望的值相等,就使用一個新值替換當前變量的值。
CAS的使用場景
在程序和算法中一個經(jīng)常出現(xiàn)的模式就是“check and act”模式。先檢查后操作模式發(fā)生在代碼中首先檢查一個變量的值,然后再基于這個值做一些操作。下面是一個簡單的示例:
class MyLock { private boolean locked = false; public boolean lock() { if(!locked) { locked = true; return true; } return false; } }
上面這段代碼,如果用在多線程的程序會出現(xiàn)很多錯誤,不過現(xiàn)在請忘掉它。
如你所見,lock()方法首先檢查locked>成員變量是否等于false,如果等于,就將locked設為true。
如果同個線程訪問同一個MyLock實例,上面的lock()將不能保證正常工作。如果一個線程檢查locked的值,然后將其設置為false,與此同時,一個線程B也在檢查locked的值,又或者,在線程A將locked的值設為false之前。因此,線程A和線程B可能都看到locked的值為false,然后兩者都基于這個信息做一些操作。
為了在一個多線程程序中良好的工作,”checkthenact”操作必須是原子的。原子就是說”check“操作和”act“被當做一個原子代碼塊執(zhí)行。不存在多個線程同時執(zhí)行原子塊。
下面是一個代碼示例,把之前的lock()方法用synchronized關鍵字重構成一個原子塊。
class MyLock { private boolean locked = false; public synchronized boolean lock() { if(!locked) { locked = true; return true; } return false; } }
現(xiàn)在lock()方法是同步的,所以,在某一時刻只能有一個線程在同一個MyLock實例上執(zhí)行它。
原子的lock方法實際上是一個”compare and swap“的例子。
CAS用作原子操作
現(xiàn)在CPU內(nèi)部已經(jīng)執(zhí)行原子的CAS操作。Java5以來,你可以使用java.util.concurrent.atomic包中的一些原子類來使用CPU中的這些功能。
下面是一個使用AtomicBoolean類實現(xiàn)lock()方法的例子:
public static class MyLock { private AtomicBoolean locked = new AtomicBoolean(false); public boolean lock() { return locked.compareAndSet(false, true); } }
locked變量不再是boolean類型而是AtomicBoolean。這個類中有一個compareAndSet()方法,它使用一個期望值和AtomicBoolean實例的值比較,和兩者相等,則使用一個新值替換原來的值。在這個例子中,它比較locked的值和false,如果locked的值為false,則把修改為true。
如果值被替換了,compareAndSet()返回true,否則,返回false。
使用Java5+提供的CAS特性而不是使用自己實現(xiàn)的的好處是Java5+中內(nèi)置的CAS特性可以讓你利用底層的你的程序所運行機器的CPU的CAS特性。這會使還有CAS的代碼運行更快。
感謝各位的閱讀!關于“java并發(fā)編程之cas的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!