探究Java如何實現原子操作(atomic operation)

1. 讓我們首先了解下java 中 Volatile 關鍵字

? ? ?Volatile可實現java內存模型當中的可見性,

? ? ?java內存模型的可見性:

可見性,是指線程之間的可見性,一個線程修改的狀態對另一個線程是可見的。也就是一個線程修改的結果,另一個線程馬上就能看到。

比如:用volatile修飾的變量,就會具有可見性。volatile修飾的變量不允許線程內部緩存和重排序,即直接修改內存。所以對其他線程是可見的。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?BUT

Volatile 不保證原子性:

?just like this:

? volatile int a=0; a 具有可見性 但是如下操作仍然不具有原子性 a++;

讓我們看看什么是原子操作 什么是非原子操作:

原子操作:a=0;

非原子操作 a++,即a=a+1;

那么在java 中 如何保證原子性呢?方法是 sync ,lock,unlock


2 .那么volatile的實現原理是什么?

? ? 先這樣理解:

? ? ?把對volatile變量的單個讀/寫,看成是使用同一個鎖對這些單個讀/寫操作 ? ? 做了同步。示例:

? ? ? ? ? ? ?

示例程序

下面的程序等價于上面的示例程序

?

等價程序

volatile的特性:

? (1) 對一個volatile變量的單個讀/寫操作,與對一個普通變量的讀/寫操作使用同一個鎖來同步,它們之間的執行效果相同。

可見性:對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最后的寫入。

原子性:對任意單個volatile變量的讀/寫具有原子性,但類似于volatile++這種復合操作不具有原子性。


3:來談談-------鎖

? ? ? 3.1:釋放鎖和獲取鎖的內存語義

? 當線程釋放鎖時,JMM會把該線程對應的本地內存中的共享變量刷新到主內存中,示例代碼如下:

?

code

假設線程A執行writer()方法,隨后線程B執行reader()方法。

整個的執行過程如下:threadA(1->2->3)->threadB(4->5->6)

根據happen-before原則:3執行前的所有A線程的操作在3執行成功后對4以后的流程立即可見

鎖釋放和鎖獲取的內存意義:當線程釋放鎖時,JMM會把該線程對應的本地內存中的變量刷新到主內存中。

當線程獲取共享變量時,會把本地內存中的變量設置為無效,

從而使得被監控的臨界區中的代碼必須去主內存中去讀取共享變量。


4:那就來看看 atomic operation,原子操作不需要sync:



作者:銅雀春深鎖不住
鏈接:https://www.jianshu.com/p/5195f7f742a8
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

轉載于:https://www.cnblogs.com/lukelook/p/11252715.html

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

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

相關文章

JAVA-重寫equalse規范、技巧

JAVA-重寫equalse規范、技巧 1、自反性 任何非空引用x,x.equalse(x) 應該返回true2、對稱性 任何引用x和y,當x.equals(y)返回true,y.equals(x)也應返回true3、傳遞性 任何引用x、y和z,當x.equalse(y)和y.equalse(z),那…

Password Creator(HTA)

<!--- 功能&#xff1a; 生成隨機密碼- 輸入&#xff1a; 用戶的設置- 輸出&#xff1a; 隨機密碼&#xff0c;同時拷貝到剪切板- 作者&#xff1a; maskx- 版本&#xff1a; v1.0- 歷史紀錄&#xff1a; 2007-7-11新建 - 創建時間&#xff1a; 200…

Julia 排坑指南

Julia 是一個高效的計算語言&#xff0c;據說性能和C有一拼。 Google也開始支持TPU的Julia&#xff0c; 個人覺得他的可視化比較厲害&#xff0c;下面是自己安裝過程的截圖&#xff0c;由于Julia的服務器在國外&#xff0c;所以下載的過程會出現一些不可描述的問題&#xff0c;…

Arts 第十九周(7/22 ~ 7/28)

ARTS是什么&#xff1f;Algorithm&#xff1a;每周至少做一個leetcode的算法題&#xff1b;Review&#xff1a;閱讀并點評至少一篇英文技術文章&#xff1b;Tip&#xff1a;學習至少一個技術技巧&#xff1b;Share&#xff1a;分享一篇有觀點和思考的技術文章。 Algorithm 深度…

難過的要命。。。。。。

請允許我這樣叫幾下&#xff0c;我知道自己是個老姑娘了&#xff0c;不能像小女孩那樣碰到點不開心的事就一哭二鬧三上吊。我不哭不鬧更不會傻得去上吊&#xff0c;我還有幾十年的大好日子要過呢&#xff0c;我兒子還沒生呢。現在我們還沒有正式的攤牌&#xff0c;應該說只差最…

基于.NET2.0的System.Net.Mail發送郵件Demo

第一種: //emailaddress郵件接收者地址 //mailcontent郵件主體內容 //mailtitle郵件標題 //mailsubject郵件主題 public bool SendMail(string emailaddress,string mailcontent,string mailtitle,string mailsubject) { …

美國美國,USA USA

外派美國微軟接的項目職位名稱&#xff1a;開發主管&#xff08;SDE LEADER&#xff09; 工作城市&#xff1a;Redmond 職位要求: Good English communicationGood SQL and C# .net framework experienceBackend developmentBI knowledge (he is expected to deal with millio…

Windows Server 2016之RDS配置證書

證書我們可以自己創建也可以到阿里云申請&#xff0c;一次申請可以用一年&#xff0c;&#xff08;自己創建的證書是不受信任的&#xff09;所以我們在阿里云上申請的&#xff0c;下面我們就把申請到的證書下載下來&#xff0c;放到一個文件夾里&#xff0c;并解壓接下來我們就…

升級tomcat7.0之后的問題

學習web也有幾天了&#xff0c;今天把tomcat改成7.0的之后老是出現嚴重警告&#xff1a; 嚴重: The web application [/struts2_0100] created a ThreadLocal with key of type [com.opensymphony.xwork2.inject.ContainerImpl$10](value[com.opensymphony.xwork2.inject.Conta…

慎重對待青霉素皮試

青霉素類藥不同品種間存在交叉過敏關系。 所以&#xff0c;中國藥典規定&#xff0c;青霉素類藥物在注射前必先使用青霉素鈉&#xff08;鉀&#xff09;及氯化鈉注射液配制的溶液做皮內敏感試驗。皮試液濃度為每毫升500單位&#xff0c; 皮內注射0.1毫升&#xff0c;陽性反應者…

2018阿里云雙11拼團大促主會場全攻略

為什么80%的碼農都做不了架構師&#xff1f;>>> 摘要&#xff1a; 在雙十一這個一年唯一一次的大幅度降價促銷日&#xff0c;怎樣才能花最少的錢配置最特惠的云服務&#xff1f;云棲社區特為各位開發者奉獻出省錢大法如下&#xff01; 2018阿里云雙十一拼團大促活動…

匿名用戶訪問用發布站點模板創建網站的列表項時要求登錄的問題解決

因為發布站點中的一個Feature被打開了&#xff0c;造成將列表FormPage的查看給Lock了&#xff0c;所以需要登錄&#xff0c;將其關閉就OK了。哈哈。英文KB&#xff1a;Users are unexpectedly prompted to enter their credentials when they access a list in a Windows Share…

知識點1: 進度條隨數據變化,并添加漸變樣式

效果圖&#xff1a; dom&#xff1a; //  進度條             <div class"progress" :style"styleObj1"><div class"point"></div></div>//  數據容器<div class"precent"><counte…

第三篇.python編輯器和集成環境01

修改python的鏡像源 使用pip可以提高網速\Lib\site-packages\pip\models\index.py文件&#xff0c;將PYPI的值改為你所需要的鏡像源即可&#xff0c;例如改為豆瓣鏡像源&#xff1a; #PyPI Index(https://pypi.python.org/) PyPI Index(https://pypi.douban.com/) 轉載于:h…

常用SQL語句技法

下列語句部分是Mssql語句&#xff0c;不可以在access中使用。 SQL分類&#xff1a; DDL—數據定義語言(CREATE&#xff0c;ALTER&#xff0c;DROP&#xff0c;DECLARE) DML—數據操縱語言(SELECT&#xff0c;DELETE&#xff0c;UPDATE&#xff0c;INSERT) DCL—數據控制語言(GR…

JSP2.0中Simple Tag介紹

JSP2.0中為了簡化標簽的復雜性&#xff0c;增加了制作Simple Tag的標簽類SimpleTagSupport類。 SimpleTagSupport類是實現SimpleTag接口的。它只需要實現一個doTag()方法即可&#xff0c;而不需要一堆回傳值。 舉例說明&#xff1a; 例1&#xff1a;HelloSimpleTag標簽 第一步&…

[置頂] 動軟軟代碼生成器使用(127.0.0.1)無法看到 SQLServer2008 新附加數據庫的 原因 以及 解決方案...

在項目中&#xff0c;使用代碼生成器給我們的開發工作帶來了相當大的方便&#xff0c;而有時候會出現這樣的問題&#xff0c;就是新附加的數據庫在動軟代碼生成器當中看不到&#xff0c;奇了怪了 一&#xff0c;首先看動軟代碼生成器的鏈接字符串&#xff0c;如圖 &#xff0c;…

對Hibernate使用之愚見

對Hibernate使用之愚見 國人跟風之潮&#xff0c;自古有之&#xff0c;至今亦然。確實&#xff0c;經過配置優化的Hibernate效率與無任何優化的Hibernate效率誠然不可同日而語。但由于項目開發的復雜性&#xff0c;開發周期中一些突發因素的制約&#xff0c;及項目構建者自身能…

設計模式學習總結1 - 創建型1 - Abstract Factory抽象工廠模式

AbstractFactory抽象工廠模式&#xff08;創建型&#xff09; 作用&#xff1a; 這種模式支持創建不同的對象&#xff0c;這些對象功能接近且一般都是在一起創建的。抽象工廠被具體化成不同的工廠來創建類似產品的不同產品。這種模式將類于使用的客戶端分離以便通過工廠來創建。…

QT練習9 Dialog學習

http://files.cnblogs.com/hnrainll/dialog.zip 源代碼下載轉載于:https://www.cnblogs.com/hnrainll/archive/2011/05/30/2063135.html