成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

CAS 原理深入剖析,深入內核源碼的那種

系統
CAS 的意思是 compare and swap,比較并交換。有一種情況是,在你更新結果之前,其他有個線程在中途把 A 更新成了 5 ,又更新回了 2。但是在當前線程看起來,沒有被改過。這就是 ABA 問題。

 [[385679]]

本文轉載自微信公眾號「KK架構師」,作者wangkai。轉載本文請聯系KK架構師公眾號。   

一、CAS 簡介

CAS 的意思是 compare and swap,比較并交換。

CAS 的示意圖如下:

 

比如一個很簡單的操作,把變量 A = 2 加 1,結果為 3.

則先讀取 A 的當前值 E 為 2,在內存計算結果 V 為 3,比較之前讀出來的 A 的當前值 2 和 最新值,如果最新值為 2 ,表示這個值沒有被別人改過,則放心的把最終的值更新為 3.

有一種情況是,在你更新結果之前,其他有個線程在中途把 A 更新成了 5 ,又更新回了 2。但是在當前線程看起來,沒有被改過。這就是 ABA 問題。

二、CAS 的實現

在 java 中,原子類都是用 cas 來實現的,我們可以看一看源碼。

  1. public final int getAndIncrement() { 
  2.     return unsafe.getAndAddInt(this, valueOffset, 1); 

發現是調用了 unsafe 類的 getAndAddInt,繼續看這個方法:

  1. public final int getAndAddInt(Object var1, long var2, int var4) { 
  2.     int var5; 
  3.     do { 
  4.         var5 = this.getIntVolatile(var1, var2); 
  5.     } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); 
  6.  
  7.     return var5; 

這里是一個 while 循環,直到比較成功,來看一下這個 compareAndSwapInt 方法

  1. public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5); 

發現這是一個 native 方法,意味著是 c 或者 c++ 寫的虛擬機的實現。

在網上找到了 HotSpot 虛擬機的源碼,找了一些資料發現了這個 compareAndSwapInt 的 c++ 代碼:

在 unsafe.cpp 這個文件的 Unsafe_CompareAndSwapInt 這個方法里

 

發現最終調用的是 Atomic:: cmpxchg 方法,我們再找到 atomic_linux_x86.inline.hpp 這個文件

 

其中有一句 LOCK_IF_MP(%4) "cmpxchgl %1,(%3)"

LOCK_IF_MP 是一個宏,這個宏的定義是:

 

mp 的意思是 multi processor,意思是在多核 cpu 上,要鎖一下這個指令。

到這里,結論是,最終調用了一條匯編指令:lock cmpxchg 指令,來實現底層 cas 的。

也就是 cpu 中有一條 cmpxchg 指令。

但是這條指令不是原子的,也就是拿出來和比較是兩個操作,中間有可能被別人打斷。

所以需要在這個過程加上 lock,意思是,我在對這個內存操作的過程中,不允許被別人打斷。

可以簡單理解為把內存總線鎖住,別人不允許修改這塊內存。

 

三、ABA 問題的解決

很簡單,可以在數據上加上版本號即可,改了一次就新增一個版本號。

在 Java 中,可以使用 AtomicStampedReference 來解決這個問題

  1. import java.util.concurrent.atomic.AtomicInteger; 
  2. import java.util.concurrent.atomic.AtomicStampedReference; 
  3.  
  4. public class ABASingle { 
  5.  
  6.     public static void main(String[] args) { 
  7.         AtomicInteger atomicInt = new AtomicInteger(100); 
  8.         atomicInt.compareAndSet(100, 101); 
  9.         atomicInt.compareAndSet(101, 100); 
  10.         System.out.println("new value = " + atomicInt.get()); 
  11.         boolean result1 = atomicInt.compareAndSet(100, 101); 
  12.         System.out.println(result1); // result:true 
  13.  
  14.         AtomicInteger v1 = new AtomicInteger(100); 
  15.         AtomicInteger v2 = new AtomicInteger(101); 
  16.         AtomicStampedReference<AtomicInteger> stampedRef = new AtomicStampedReference<AtomicInteger>( 
  17.                 v1, 0); 
  18.  
  19.         int stamp = stampedRef.getStamp(); 
  20.         stampedRef.compareAndSet(v1, v2, stampedRef.getStamp(), 
  21.                 stampedRef.getStamp() + 1); 
  22.         stampedRef.compareAndSet(v2, v1, stampedRef.getStamp(), 
  23.                 stampedRef.getStamp() + 1); 
  24.         System.out.println("new value = " + stampedRef.getReference()); 
  25.         boolean result2 = stampedRef.compareAndSet(v1, v2, stamp, stamp + 1); 
  26.         System.out.println(result2); // result:false 
  27.     } 

 

責任編輯:武曉燕 來源: KK架構師
相關推薦

2020-11-12 18:08:05

JavaLinux多線程

2020-11-20 07:55:55

Linux內核映射

2009-03-06 16:48:23

數據塊原理Oracle

2009-03-26 10:33:34

Oracle數據塊數據庫

2016-03-14 16:35:40

IT專家網

2024-04-29 09:06:46

線程初始化源碼

2022-11-14 11:09:36

源碼AQS加鎖

2010-09-17 15:32:52

JVM工作原理

2022-09-05 22:22:00

Stream操作對象

2024-04-29 08:06:19

Redis分布式系統

2010-01-25 17:14:44

Android應用程序

2009-09-27 17:13:36

Hibernate V

2011-06-03 13:48:18

JavaScript重構

2010-06-03 13:08:51

2009-07-06 10:44:45

JSP charset

2009-09-14 15:12:40

LINQ to XML

2010-05-25 12:59:00

Subversion

2010-09-15 15:27:06

CSS hack

2010-05-27 10:23:01

SVN文檔

2010-06-30 16:00:01

FTP協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久av | 免费观看毛片 | 亚洲成人一级片 | 欧美福利在线 | 国产一级淫片免费视频 | 天天av天天好逼 | 羞羞免费网站 | 国产三级电影网站 | 精品久久久久久久久久久久 | 伊人激情网 | 日本中文字幕日韩精品免费 | 国产亚洲精品一区二区三区 | 国产精品美女久久久久久免费 | 四季久久免费一区二区三区四区 | 久久久久国产视频 | 欧美一区二区在线播放 | 免费视频一区二区 | 亚洲人成网亚洲欧洲无码 | 午夜精品久久久久久久久久久久久 | 亚洲高清在线 | 国产乱码精品一区二区三区中文 | 一区二区三区在线播放 | 国产农村一级片 | 精品美女久久久 | 成人在线视频网址 | 欧美日韩中文在线观看 | 久热久草| 欧产日产国产精品国产 | 在线国产一区 | 国产精品久久久久久久久久免费看 | a级免费黄色片 | 国产一区二区三区 | 正在播放国产精品 | 毛片韩国| 天天综合91 | 国产精品欧美一区喷水 | 国产视频福利在线观看 | 欧美伦理一区 | 精品国产一区二区三区久久久四川 | 久久久久精 | 国产乱码精品一区二三赶尸艳谈 |