java cas原理_Java并發之原子變量及CAS算法-上篇

Java并發之原子變量及CAS算法-上篇

def57216edb1d8ef02852842c6f934fb.png

編輯

?

概述

本文主要講在Java并發編程的時候,如果保證變量的原子性,在JDK提供的類中是怎么保證變量原子性的呢?。對應Java中的包是:java.util.concurrent.atomic包下。因為涉及到了CAS算法,需要對CAS算法講解及CAS算法三個問題怎么解決以及和Synchroized比較。文章比較長,所以就分為上下兩個篇幅講解。本文是上篇《Java并發之原子變量及CAS算法-上篇》

本文是《凱哥分享Java并發編程之J.U.C包講解》系列教程中的一篇。如果想系統學習,建議從第一篇開始看。

原子變量案例

在Java中有一種寫法:int i = 10; i++ 這種寫法。

我們先來看看:

5c6f273d0d41f95393364874fcee8858.png

編輯

?

輸入的是0還是1呢 ?

I++輸出0的原因分析

答案是:0。為什么呢?凱哥把編譯后的class文件反編譯,咱們看:

2093ec14dc876a280bba3e1e3301edb7.png

編輯

?

說明:i的操作是i++;y的操作是++y.

從反編譯后的代碼,我們可以看到i++在JVM中的操作,總共分三步:

第一步:聲明變量var10000 ,然后將i賦值給var10000,此時var10000的值是0;

第二步:聲明變量var3 然后把i+1 賦值給var3,此時,var3的值等于1了;

第三步:將變量var10000的值又賦值給了i,此時因為var10000的值是0,所以i的值也是0

所以在sysout(i)的時候,就輸出了0.

我們分析上面1,2,3步驟,可以發現。其實i++執行的是:讀取-修改-重寫 三個操作。

既然讀寫操作,就會涉及到變量原子性。測試在多線程下變量原子性

測試多線程下的變量原子性

那么,如果我們把對i的操作放到多個線程中操作結果會是什么樣的呢?

線程操作I的代碼:

7c70ee81f1492c329b0606f2e36282ae.png

編輯

?

開啟十個線程同時操作i的代碼:

e14047d981dd9cdf94e25030865efcfe.png

編輯

?

我們來看看運行結果:

55be67b9b3454b230eb5f1a5ba91d5aa.png

編輯

?

從運行結果中,我們可以看到,線程Thread-5和線程Thread-8的值是一樣的。

根據上面運行的場景,我們發現,變量i其實是十個線程中的共享變量。從運行的結果來看,多個線程操作后,結果出問題了。

不同線程在內存中運行模擬圖:

7460314cd54dd534655bf2e330078f9a.png

編輯

?

線程1;線程2;以及主線程之間運行關系,可以詳見凱哥上一篇文章:《Java并發之內存可見性問題怎么解決》。這篇文章詳細講解了怎么關系。

已經看過凱哥上一篇文章或者是知道volatile關鍵字的朋友可能要說,這不就是線程之間變量可見性問題嘛。使用volatile關鍵字修飾i就可以了。真的可以了嗎?

我們修改程序,用volatile來修飾,看看運行結果:

使用volatile關鍵字是否能解決多線程情況下變量原子性呢?

用volatile來修飾變量:

private volatile int shardData = 0;

運行結果:

7025412811ed58472fcbb681fb34fc17.png

編輯

?

我們發現,就算使用volatile關鍵字修飾了,依然存在多線程下變量原子性的問題。

怎么解決這種并發下變量原子性問題呢?

Java的atomic包

在jdk1.5以后,Java為我們提供了一個常用的原子變量。都在:java.util.concureent.atomic包下。我們來看看,都有哪些:

09b196cb3db2a4d339d7638f09271786.png

編輯

?

818e0fd24920844ddcbfba505b7661a6.png

編輯

?

493045f60a94b308af1774a0303b4eca.png

編輯

?

從JDK的API文檔中(凱哥使用的是JDK1.8的API)我們可以看到常用的原子性變量。

怎么保證原子性呢?

那么,在atomic包下的這些類怎么保證原子性呢?

1:該包下的變量都是使用volatile關鍵字來修飾。

解決了多線程之間變量可見性。

Int類型的原子性對象AtomicInteger對象中:

1bbaa901c3576629ef36aa41936e4998.png

編輯

?

用于對象的AtomicReference對象中:

e6b8af6232a8cc24ee090cdf45340653.png

編輯

?

都是使用volat關鍵字修飾的。

2:使用CAS算法

保持了變量的原子性

總結:

在Java的JDK中提供了concurrent.atomic包,使用這個包下的對象創建的變量就能保證原子性。

保證原子性的策略:

1:變量都是用Volatile關鍵字修飾。來保證內存可見性

2:使用CAS算法,來保證原子性。

928f920dbfb8298bd43333eaec0c4d9e.png

編輯

?

下篇預告:

在下一篇文章中,我們主要講解CAS算法原理及CAS算法會參數哪些問題(三個問題)?JDK是怎么解決的?修改i++使其成為具有原子性變量怎么實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533684.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

node ajax validator,使用validator.js對字符串數據進行驗證

validator.js是一個對字符串進行數據驗證和過濾的工具庫,同時支持Node端和瀏覽器端,github地址是https://github.com/chriso/validator.js主要API如下:驗證APIcontains(str, seed)驗證str中是否含有seedequals(str, comparison)驗證是否相等i…

css span 右端對齊_CSS標準文檔流

web頁面的制作,是個“流”,像水流一樣,必須從上往下,一點點的編織,不像畫畫,可以這個地方畫一個,另一個地方畫一個,隨意而為。標準文檔流的一些微觀現象1. 空白折疊現象1)標簽與標簽…

composer升級_Composer 使用姿勢與 Lumen 升級指南

Composer 使用姿勢這里主要說說 composer.json 和 composer.lock 文件的作用。composer.jsoncomposer.json 文件包含了項目的依賴和其它的一些元數據,使用 JSON format 編寫。當初次調用 composer install 時,Composer 會根據 composer.json 文件&#x…

服務器間傳文件$d,基于OpenSSH+WinSCP完成Windows服務器之間的文件傳輸

背景經常會遇到在不同服務器之間傳輸文件,Linux和Linux之間用命令rsync, windows和linux之間普遍是有圖形化界面的ftp軟件,老黃平時用的比較多的是FileZilla。Windows和Windows之間的話,90%都是在一臺機器復制,到另一臺…

dbgrideh 為什么只一行_Mysql性能優化:為什么count(*)這么慢?

導讀在開發中一定會用到統計一張表的行數,比如一個交易系統,老板會讓你每天生成一個報表,這些統計信息少不了sql中的count函數。但是隨著記錄越來越多,查詢的速度會越來越慢,為什么會這樣呢?Mysql內部到底是…

jmeter 高并發測試報告_JMeter分布式測試

一、為什么要使用分布式測試按照一般的壓力機配置,jmeter的GUI模式下(Windows),最多支持300左右的模擬請求線程,再大的話,容易造成卡頓、無響應等情況,這是限于jmeter其本身的機制和硬件配置。有時候為了盡量模擬業務場…

登陸攔截攔截ajax,過濾器實現登錄攔截需要注意的問題(AJAX請求的處理)

1.問題描述:最近自己在寫demo時遇到一個問題,在ajax請求時用Filter做登錄攔截,結果頁面不跳轉(Ajax是不能做轉發和重定向的)、、、、最終的最終在同事zt的提示下,恍然大悟,雖然很基本的問題,但也糾結了好久…

半圓陰影_六年級數學:怎么求陰影部分面積?正方形與半圓,割補法常考題

歡迎您來到方老師數學課堂,請點擊上方藍色字體,添加關注。所有的視頻內容,全部免費,請大家放心關注,放心訂閱。六年級數學:怎么求陰影部分面積?正方形與半圓,割補法常考題。大家先在…

c語言判斷整數_用c++編寫閏年的判斷基礎程序

其實c語言與c語言有太多共同的東西,學習過c語言再學習c語言就顯得輕而易舉。當然學過了c再去學習c語言也是有一些幫助的(但是個人不提倡先學習c在學c語言)。由于現在經常看見有關閏年的程序,風式各樣,眼花繚亂,些許凌亂&#xff0…

cat日志 搜索_大日志,看我如何對付你

在服務器接口測試中,我們經常會和各種日志打交道。一旦測試時服務端出現了問題,而單憑服務端的日志又不能發現問題原因的時候,往往開發要向我們測試人員詢問客戶端這邊的情況,希望看看我們能不能提供一些有用信息,如錯…

python編譯成dll文件_用vc生成可被python調用的dll文件

前提已經有.c 和.i文件 用swid編譯了.i文件生成了wrap.c文件和.py文件 vc創建dll工程 將.h加入到頭文件中.c文件和wrap.c文件添加到源文件中 將.i文件添加到工程目錄下 Tools->Options->Directories中修改include 和lib 添加python里的include 和libs 把\libs\python27.l…

加載gif動圖_GIF生成神器——ScreenToGif

每次需要做一個動圖展示時,總是感覺很頭疼。截圖吧,需要的圖片太多;錄視頻吧,文件太大;做動圖吧,太麻煩。今天推薦的這個軟件或許能夠解決大家這個困惑,今天推薦的是動圖生成神器——ScreenToGi…

vue底部選擇器_vue實現動態顯示與隱藏底部導航的方法分析

vue實現動態顯示與隱藏底部導航的方法分析本文實例講述了vue實現動態顯示與隱藏底部導航的方法。分享給大家供大家參考,具體如下:在日常項目中,總有幾個頁面是要用到底部導航的,總有那么些個頁面,是不需要底部導航的&a…

java 修改最大nio連接數_關于java流的幾個概念:IO、BIO、NIO、AIO,有幾個人全知道?...

關于同步、阻塞的知識我之前的文章有介紹,所以關于流用到這些概念與之前多線程用的概念一樣。下面具體來看看java中的幾種流IO/BIOBIO就是指IO,即傳統的Blocking IO,即同步并阻塞的IO。這也是jdk1.4之前的唯一選擇,依賴于ServerSocket實現&am…

python神秘的魔法函數_python魔法函數

一、參考二、構造和初始化2.1 __new__在對象實例化過程中最先調用的方法是__new__, 該方法接收參數為類,然后將其他參數,傳遞給__init__, 該魔法函數比較少見,可以使用其,創建單例類; __new__方法是一個類方法,需要攜帶…

python掃雷 廣度優先_廣度優先搜索(BFS)解題總結

定義 廣度優先搜索算法(Breadth-First-Search),是一種圖形搜索算法。 簡單的說,BFS是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。 如果所有節點均被訪問,則算法中止。 BFS同樣屬于盲目搜索。 一般用隊…

python默認參數陷阱_python默認參數陷阱

0|1陷阱?學過函數的人一定聽說過函數的默認參數,關于函數的默認參數,請看以下的例子:def extendList(val, lst[]):lst.append(val)return lstlist1 extendList(10)list2 extendList(123, [])print(list1 %s % list1)print(list…

python裁剪圖片并保存_python – 如何從圖像中剪切輪廓并將其保存到新文件中

大家好,這是我的第一個問題所以請保持溫和.我有一個計算機視覺領域的項目,我是新的,我會很感激一些幫助.我有一個pcb的圖像,我的(首先)任務是從背景中切斷電路板并將其保存到新文件.如果結果只是沒有灰色背景的普通pcb,那就沒問題了. 我到目前為止嘗試的是,首先使用閾值將圖像轉…

opencv如何把一個矩陣不同列分離開_學習OPEN_CV

OpenCv中文論壇精華地址http://www.opencv.org.cn/index.php/User:Ollydbg23http://sivp.sourceforge.net/(sivp)一、基礎操作1. 數據類型 數據結構了解圖像相關:cvArr cvMat IplImage數據數組的維數, 與數據的通道數 見P46 (76)2. 常見的矩陣操作熟悉3…

python文件合并_用Python 將兩個文件的內容合并成一個新的文件.

一個文件的內容是:IntroductiontoProgramming,NetworkingFundamentals,InternetworkingTechnologies,PlatformTechnologies,InformationTechnologyforUsers,ComputerForensics,Enterpr... 一個文件的內容是: Introduction to Programming, Networking Fundamentals, Internetwo…