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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java concurrent int_java.util.concurrent.AtomicInteger

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java concurrent int_java.util.concurrent.AtomicInteger 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AtomicInteger,一個提供原子操作的Integer的類。在Java語言中,++i和i++操作并不是線程安全的,在使用的時候,不可避免的會用到synchronized關鍵字。而AtomicInteger則通過一種線程安全的加減操作接口。

來看AtomicInteger提供的接口。

//獲取當前的值

public final int get()

//取當前的值,并設置新的值

public final int getAndSet(int newValue)

//獲取當前的值,并自增

public final int getAndIncrement()

//獲取當前的值,并自減

public final int getAndDecrement()

//獲取當前的值,并加上預期的值

public final int getAndAdd(int delta)

... ...

為什么說atomicInteger是線程安全的呢?

在AtomicInteger的源碼中相關的代碼如下:

Java代碼??

//?setup?to?use?Unsafe.compareAndSwapInt?for?updates

private?static?final?Unsafe?unsafe?=?Unsafe.getUnsafe();

上面這行代碼是獲取Unsafe實例的。一般情況下,我們是拿不到該類的實例的,當然jdk庫里面是可以隨意使用的。

Java代碼??

static?{

try?{

valueOffset?=?unsafe.objectFieldOffset

(AtomicInteger.class.getDeclaredField("value"));

}?catch?(Exception?ex)?{?throw?new?Error(ex);?}

}

上面這幾行代碼,是用來獲取AtomicInteger實例中的value屬性在內存中的位置。這里使用了Unsafe的objectFieldOffset方法。這個方法是一個本地方法,?該方法用來獲取一個給定的靜態屬性的位置。

Java代碼??

public?native?long?objectFieldOffset(Field?f);

這里有個疑問,為什么需要獲取屬性在內存中的位置?通過查看AtomicInteger源碼發現,在這樣幾個地方使用到了這個valueOffset值:

Java代碼??

public?final?void?lazySet(int?newValue)?{

unsafe.putOrderedInt(this,?valueOffset,?newValue);

}

Java代碼??

public?final?boolean?compareAndSet(int?expect,?int?update)?{

return?unsafe.compareAndSwapInt(this,?valueOffset,?expect,?update);

}

Java代碼??

public?final?boolean?weakCompareAndSet(int?expect,?int?update)?{

return?unsafe.compareAndSwapInt(this,?valueOffset,?expect,?update);

}

查找資料后,發現lazySet方法大多用在并發的數據結構中,用于低級別的優化。compareAndSet這個方法多見于并發控制中,簡稱CAS(Compare And Swap),意思是如果valueOffset位置包含的值與expect值相同,則更新valueOffset位置的值為update,并返回true,否則不更新,返回false。

這里可以舉個例子來說明compareAndSet的作用,如支持并發的計數器,在進行計數的時候,首先讀取當前的值,假設值為a,對當前值 + 1得到b,但是+1操作完以后,并不能直接修改原值為b,因為在進行+1操作的過程中,可能會有其它線程已經對原值進行了修改,所以在更新之前需要判斷原值是不是等于a,如果不等于a,說明有其它線程修改了,需要重新讀取原值進行操作,如果等于a,說明在+1的操作過程中,沒有其它線程來修改值,我們就可以放心的更新原值了。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java concurrent int_java.util.concurrent.AtomicInteger的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。