什么是硬體同步原語?
硬體同步原語(Atomic Hardware Primitives)是由計算機硬體提供的一組原子操作,
我們常見的原語操作有CAS和FAA兩種,
CAS
Compare and Swap(CAS),字面意思是先比較,再計算,它的偽代碼如下,
<< atomic >>
function cas(p : pointer to int, old : int, new : int) returns bool {
if *p ≠ old {
return false
}
*p ← new
return true
}
它的輸入引數有三個:
- p:要修改的變數的指標
- old:舊值
- new:新值
回傳值是一個布林值,標識是否賦值成功,
FAA
Fetch and Add(FAA),它的含義是先獲取變數當前的值value,然后給變數p增加inc,最后回傳變數p之前的值value,
它的偽代碼如下:
<< atomic >>
function faa(p : pointer to int, inc : int) returns int {
int value <- *location
*p <- value + inc
return value
}
上述兩段偽代碼,它們的特殊之處在于它們都是由計算機硬體,具體講就是CPU提供實作,可以保證操作的原子性,
因為原子操作具有不可分割性,也就不存在并發的問題,所以在某些情況下,原語可以用來替代鎖,實作一些安全又高效的并發操作,
CAS和FAA在各種編程語言中,都有相應的實作,可以直接使用,無論哪種編程語言,它們底層的實作是一樣的,效果也是一樣的,
Java中的操作原語
Java語言本身支持操作原語,Java中的CAS可以理解為樂觀鎖,java.util.concurrent.atomic包下面的類已經實作了樂觀鎖,其中最常用的是AtomicInteger,可以將其看做實作了CAS操作的Integer,
下面是使用AtomicInteger的示例代碼,
private static AtomicInteger count = new AtomicInteger(0);
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
//每個執行緒讓count自增100次
for (int i = 0; i < 100; i++) {
count.incrementAndGet();
}
}
}).start();
}
try{
Thread.sleep(2000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(count);
}
作者:李潘
出處:http://wing011203.cnblogs.com/
本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/547331.html
標籤:其他
上一篇:怎么正確使用鎖?
