最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
使用Java怎么實(shí)現(xiàn)一個(gè)CAS和Unsafe類-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)使用Java怎么實(shí)現(xiàn)一個(gè)CAS和Unsafe類,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

成都創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開(kāi)發(fā),軟件開(kāi)發(fā),小程序開(kāi)發(fā),10年建站對(duì)成都混凝土泵車等多個(gè)方面,擁有多年的網(wǎng)站推廣經(jīng)驗(yàn)。

兩者對(duì)比

sychronized和volatile都解決了內(nèi)存可見(jiàn)性問(wèn)題
不同點(diǎn):
(1)前者是獨(dú)占鎖,并且存在者上下文切換的開(kāi)銷以及線程重新調(diào)度的開(kāi)銷;后者是非阻塞算法,不會(huì)造成上下文切換的開(kāi)銷。
(2)前者可以保證操作的原子性,但是后者不能保證操作的原子性。

在什么情況下才會(huì)使用volatile

  • 寫入變量是不依賴當(dāng)前值的,如果是依賴當(dāng)前值的話,由于獲取-計(jì)算-寫入,三者不是原子性操作,而volatile是保證原子性操作的。

  • 變量沒(méi)有加鎖的時(shí)候,如果變量加鎖了,是可以保證內(nèi)存的可見(jiàn)性的因此不需要再使用volatile


Java中的原子性操作

  • 原子性操作通俗的來(lái)講就是一組操作,要么都執(zhí)行成功,要么都執(zhí)行失敗,不存在執(zhí)行部分成功的情況

  • 使用synchronized關(guān)鍵字既可以保證操作的原子性又可以保證內(nèi)存的可見(jiàn)性,volatile只能保證內(nèi)存的可見(jiàn)性,但是不能保證操作的原子性;synchronized固然好,但在高并發(fā)的情況下,由于它是一種獨(dú)占鎖,因此會(huì)引起性能低下的問(wèn)題。


Java中的CAS操作

  • 定義:CAS(compare and swap)比較并交換,這是JDK提供的一種非阻塞算法,它通過(guò)硬件保證了比較-更新的原子性問(wèn)題。JDK中的Unsafe類提供了一系列的compareAndSwap*方法,下面以compareAndSwapLong為例進(jìn)行講解

  • boolean compare(Object obj,long offset,long expect,long update)

  • 先分別解釋一下各個(gè)參數(shù),obj是一個(gè)對(duì)象的引用(也就是對(duì)象存儲(chǔ)的地址),offset是相對(duì)于前面地址的偏移量,expect是一個(gè)預(yù)想的值,update代表如果和預(yù)想的值一樣,那么就是使用update這個(gè)值來(lái)代替,并且返回true,否則返回false

  • 這是處理器提供的一種原子性指令


ABA問(wèn)題

  • 描述:線程1獲取變量x的值為A,然后嘗試修改為B,但是此時(shí)如果有另一個(gè)線程修改了x的值為B,同時(shí)又修改成了A,那么線程2的這個(gè)A和線程1之前的A就不是同一個(gè)A了

  • 產(chǎn)生原因:環(huán)形依賴,變量的值從A到B,然后又從B到A,這樣只能一個(gè)方向輪轉(zhuǎn),如果是從A到B,然后從B到C就不會(huì)出現(xiàn)這種情況。

  • 解決方式:JDK中的AtomicStampedReferece給每個(gè)變量一個(gè)時(shí)間戳,從而避免了ABA問(wèn)題


Unsafe類

在JDK中的rt.jar包中有許多方法都是native的,這是一種硬件級(jí)別的操作,使用JNI來(lái)調(diào)用C++底層函數(shù)來(lái)操作。

1.long objectFieldOffset(Field field)

釋義:獲取某個(gè)對(duì)象的中的某個(gè)域值所在對(duì)象的中的內(nèi)存偏移量

try{
 long value = Unsafe.objectFieldOffset(AutomicLong.class.getDeclaredField("value"));
}catch(Exception e){
 e.printStackTrace();
}

2.int arrayBaseOffset(Class arrayClass)

釋義:獲取數(shù)組中的第一個(gè)元素地址

3.int arrayIndexOffset(Class arrayClass)

釋義:獲取數(shù)組中第一個(gè)元素的字節(jié)大小

4.boolean compareAndSwapLong(Object obj,long offset,long expect,long update)

以上就是使用Java怎么實(shí)現(xiàn)一個(gè)CAS和Unsafe類,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站題目:使用Java怎么實(shí)現(xiàn)一個(gè)CAS和Unsafe類-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://fisionsoft.com.cn/article/eipdi.html