激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java并發編程之cas詳解

java并發編程之cas詳解

2021-01-30 12:09mengwei Java教程

這篇文章主要介紹了java并發編程之cas詳解,涉及cas使用場景和cas用作原子操作等內容,具有一定參考價值,需要的朋友可以了解下。

CAS(Compare and swap)比較和替換是設計并發算法時用到的一種技術。簡單來說,比較和替換是使用一個期望值和一個變量的當前值進行比較,如果當前變量的值與我們期望的值相等,就使用一個新值替換當前變量的值。這聽起來可能有一點復雜但是實際上你理解之后發現很簡單,接下來,讓我們跟深入的了解一下這項技術。

CAS的使用場景

在程序和算法中一個經常出現的模式就是“check and act”模式。先檢查后操作模式發生在代碼中首先檢查一個變量的值,然后再基于這個值做一些操作。下面是一個簡單的示例:

java" id="highlighter_340594">
?
1
2
3
4
5
6
7
8
9
10
class MyLock {
  private boolean locked = false;
  public boolean lock() {
    if(!locked) {
      locked = true;
      return true;
    }
    return false;
  }
}

上面這段代碼,如果用在多線程的程序會出現很多錯誤,不過現在請忘掉它。

如你所見,lock()方法首先檢查locked>成員變量是否等于false,如果等于,就將locked設為true。

如果同個線程訪問同一個MyLock實例,上面的lock()將不能保證正常工作。如果一個線程檢查locked的值,然后將其設置為false,與此同時,一個線程B也在檢查locked的值,又或者,在線程A將locked的值設為false之前。因此,線程A和線程B可能都看到locked的值為false,然后兩者都基于這個信息做一些操作。

為了在一個多線程程序中良好的工作,”checkthenact”操作必須是原子的。原子就是說”check“操作和”act“被當做一個原子代碼塊執行。不存在多個線程同時執行原子塊。

下面是一個代碼示例,把之前的lock()方法用synchronized關鍵字重構成一個原子塊。

?
1
2
3
4
5
6
7
8
9
10
class MyLock {
  private boolean locked = false;
  public synchronized boolean lock() {
    if(!locked) {
      locked = true;
      return true;
    }
    return false;
  }
}

現在lock()方法是同步的,所以,在某一時刻只能有一個線程在同一個MyLock實例上執行它。

原子的lock方法實際上是一個”compare and swap“的例子。

CAS用作原子操作

現在CPU內部已經執行原子的CAS操作。Java5以來,你可以使用java.util.concurrent.atomic包中的一些原子類來使用CPU中的這些功能。

下面是一個使用AtomicBoolean類實現lock()方法的例子:

?
1
2
3
4
5
6
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特性而不是使用自己實現的的好處是Java5+中內置的CAS特性可以讓你利用底層的你的程序所運行機器的CPU的CAS特性。這會使還有CAS的代碼運行更快。

總結

以上就是關于java并發編程cas詳解的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,歡迎您的寶貴意見,小編會及時回復大家的。感謝朋友們對本站的支持!

原文鏈接:http://ifeve.com/compare-and-swap/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 中文字幕网在线 | 在线看免费观看av | 福利免费在线观看 | 中文字幕在线观看www | 一级毛片免费的 | 未成年人在线观看 | 中文字幕在线播放第一页 | 免费网址黄 | 国产精品久久久久久久亚洲按摩 | 国产美女三级做爰 | 超久久| 久草在线视频看看 | 欧美日日操 | 国产91精品一区二区麻豆亚洲 | 久久99亚洲精品 | 国产午夜精品久久久久婷 | 欧美精品a∨在线观看不卡 午夜精品影院 | 成年人国产视频 | 欧洲a级片| 毛片大全在线观看 | a免费视频| 国产成人午夜精品 | 精品69人人人人 | 亚洲精品午夜国产va久久成人 | 98国内自拍在线视频 | xxxxhdhdhdhd日本 | 91情侣偷在线精品国产 | 欧美中文字幕一区二区 | 毛片视频网站 | 日本在线视频免费观看 | 国产免费观看av | 国产乱轮视频 | 在线观看一区二区三区四区 | 日韩视频一区在线 | 成人免费在线观看视频 | 亚洲va久久久噜噜噜久久男同 | 国产亚洲综合精品 | 欧美国产成人在线 | 91免费高清视频 | 国产亚洲精品久久久久久大师 | 欧美a视频在线观看 |