程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java並發編程之CAS,java並發cas

Java並發編程之CAS,java並發cas

編輯:JAVA綜合教程

Java並發編程之CAS,java並發cas


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

 

CAS的使用場景

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

01 class MyLock { 02   03     private boolean locked = false; 04   05     public boolean lock() { 06         if(!locked) { 07             locked = true; 08             return true; 09         } 10         return false; 11     } 12 }

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

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

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

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

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

01 class MyLock { 02   03     private boolean locked = false; 04   05     public synchronized boolean lock() { 06         if(!locked) { 07             locked = true; 08             return true; 09         } 10         return false; 11     } 12 }

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

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

CAS用作原子操作

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

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

1 public static class MyLock { 2     private AtomicBoolean locked = new AtomicBoolean(false); 3   4     public boolean lock() { 5         return locked.compareAndSet(false, true); 6     } 7   8 }

locked變量不再是boolean類型而是AtomicBoolean。這個類中有一個compareAndSet()方法,它使用一個期望值和AtomicBoolean實例的值比較,和兩者相等,則使用一個新值替換原來的值。在這個例子中,它比較locked的值和false,如果locked的值為false,則把修改為true。
如果值被替換了,compareAndSet()返回true,否則,返回false。

使用Java5+提供的CAS特性而不是使用自己實現的的好處是Java5+中內置的CAS特性可以讓你利用底層的你的程序所運行機器的CPU的CAS特性。這會使還有CAS的代碼運行更快。

轉載自並發編程網 – ifeve.com本文鏈接地址: Java並發編程之CAS

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved