日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java cas是原子性的么_Java 并发编程:AQS 的原子性如何保证

發(fā)布時間:2024/9/30 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java cas是原子性的么_Java 并发编程:AQS 的原子性如何保证 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

當我們研究AQS框架時(對于AQS不太熟知可以先閱讀《什么是JDK內(nèi)置并發(fā)框架AQS》,會發(fā)現(xiàn)AbstractQueuedSynchronizer這個類很多地方都使用了CAS操作。在并發(fā)實現(xiàn)中CAS操作必須具備原子性,而且是硬件級別的原子性。我們知道Java被隔離在硬件之上,硬件級別的操作明顯力不從心。這時為了能夠執(zhí)行操作系統(tǒng)層面的操作,就必須要通過用C++編寫的native本地方法來擴展實現(xiàn)。一般可以通過JNI方式實現(xiàn)Java代碼調(diào)用C++代碼

Unsafe調(diào)用

JDK提供了一個類來滿足CAS的硬件級別原子性要求,即sun.misc.Unsafe類,從名字上大概知道它用于執(zhí)行低級別、不安全的操作,AQS就是使用此類來完成硬件級別的原子操作。也就是說通過該類就能實現(xiàn)對處理器的原子操作,Unsafe通過JNI調(diào)用本地C++代碼,C++代碼調(diào)用了硬件指令集,這些硬件指令集都屬于CPU。

Unsafe的魔法

Unsafe是一個很強大的類,它可以分配內(nèi)存、釋放內(nèi)存、可以定位對象某字段的位置、可以修改對象的字段值、可以使線程掛起、使線程恢復、可進行硬件級別原子的CAS操作等等。

image.png

Unsafe的用途

因為存在安全性問題,所以如果我們要用Unsafe類則需要另辟蹊徑。可行的方法就是通過反射來繞過上述的安全檢查,我們可以通過以下的getUnsafeInstance方法來獲取Unsafe實例。這段代碼演示了如何獲取Java對象的相對地址偏移量以及使用Unsafe來完成CAS操作,最終輸出的是flag字段的內(nèi)存偏移量及CAS操作后的值。最終的輸出為“unsafeTest對象的flag字段的地址偏移量為:12”和“CAS操作后的flag值為:101”。另外如果使用開發(fā)工具如Eclipse,可能會編譯通不過,只要把編譯錯誤提示關(guān)掉即可。

Unsafe實現(xiàn)CAS

因為存在安全性問題,所以如果我們要用Unsafe類則需要另辟蹊徑。可行的方法就是通過反射來繞過上述的安全檢查,我們可以通過以下的getUnsafeInstance方法來獲取Unsafe實例。這段代碼演示了如何獲取Java對象的相對地址偏移量以及使用Unsafe來完成CAS操作,最終輸出的是flag字段的內(nèi)存偏移量及CAS操作后的值。最終的輸出為“unsafeTest對象的flag字段的地址偏移量為:12”和“CAS操作后的flag值為:101”。另外如果使用開發(fā)工具如Eclipse,可能會編譯通不過,只要把編譯錯誤提示關(guān)掉即可。

總結(jié)

這里主要講解了Unsafe類如何讓Java層能實現(xiàn)硬件級別的原子操作,同時也了解了Unsafe類擁有很多法魔技能。通常我們使用Java時不需要在內(nèi)存中處理Java對象及內(nèi)存地址位置,但有的時候我們被迫必須要操作Java對象相關(guān)的地址,于是我們只能使用Unsafe類。使用該類則意味著破壞了Java平臺隔離的效果了,我們都知道一旦用了本地方法則可能會引來跨平臺問題。

Java 并發(fā)編程

總結(jié)

以上是生活随笔為你收集整理的java cas是原子性的么_Java 并发编程:AQS 的原子性如何保证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。