Java多執行緒 原子類

2021-08-02 18:55:12 字數 3019 閱讀 6991

(1)基本型別

類atomicboolean、atomicinteger、atomiclong 、(atomicreference )各自提供對相應型別單個變數的訪問和更新。每個類也為該型別提供適當的實用工具方法。

(2)陣列型別

類atomicintegerarray、atomiclongarray 和atomicreferencearray 進一步擴充套件了原子操作,對這些型別的陣列提供了支援。為其陣列元素提供volatile 訪問語義,這對於普通陣列來說是不受支援的。

(3)物件的屬性修改型別:

atomicintegerfieldupdater, atomiclongfieldupdater 和 atomicreferencefieldupdater

(1)compareandset方法

原始碼如下

public

final

boolean

compareandset

(int expect,

int update)

(2)compareandswapint方法

public

final

native

boolean

compareandswapint

(object var1,

long var2,

int var4,

int var5)

;

(3)compareandswapint的native實現(c**)

unsafe_entry

(jboolean,

unsafe_compareandswapint

(jnienv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x))(

"unsafe_compareandswapint");

oop p = jnihandles:

:resolve

(obj)

; jint* addr =

(jint *

)index_oop_from_field_offset_long

(p, offset)

;return

(jint)

(atomic:

:cmpxchg

(x, addr, e)

)== e;

(4)atomic的cmpxchg方法

inline jint     atomic:

:cmpxchg (jint exchange_value,

volatile jint* dest, jint compare_value)

}

(1)定義:乙個提供原子操作的integer類,通過執行緒安全的方式操作加減,它提供原子操作來進行integer的使用,因此十分適合高併發情況下的使用。

(2)方法

方法功能

int addandget(int delta)

以原子方式將給定值與當前值相加

boolean compareandset(int expect, int update)

如果當前值 == 預期值,則以原子方式將該值設定為給定的更新值

int decrementandget()

以原子方式將當前值減 1

double doublevalue()

以 double 形式返回指定的數值

float floatvalue()

以 float 形式返回指定的數值

int get()

獲取當前值

int getandadd(int delta)

以原子方式將給定值與當前值相加

int getanddecrement()

以原子方式將當前值減 1

int getandincrement()

以原子方式將當前值加 1

int getandset(int newvalue)

以原子方式設定為給定值,並返回舊值

int incrementandget()

以原子方式將當前值加 1

int intvalue()

以 int 形式返回指定的數值

void lazyset(int newvalue)

最後設定為給定值

long longvalue()

以 long 形式返回指定的數值

void set(int newvalue)

設定為給定值

string tostring()

返回當前值的字串表示形式

boolean weakcompareandset(int expect, int update)

如果當前值 == 預期值,則以原子方式將該設定為給定的更新值

(3)例:

public

class

atomictest}}

class

atomicdemo

implements

runnable

catch

(interruptedexception e)

//結果具有隨機性

system.out.

println

(thread.

currentthread()

.getname()

+" "

+getserialnumber()

);}public

intgetserialnumber()

}

輸出結果(不唯一):

thread-

3202

thread-

4102

thread-

2303

thread-

0505

thread-

1404

小結:

Java多執行緒系列 「JUC原子類」01之 框架

根據修改的資料型別,可以將juc包中的原子操作類可以分為4類。1.基本型別 atomicinteger,atomiclong,atomicboolean 2.陣列型別 atomicintegerarray,atomiclongarray,atomicreferencearray 3.引用型別 ato...

java多執行緒系類 JUC原子類 01之框架

本系列內容全部來自於 特在此說明!根據修改的資料型別,可以將juc包中的原子操作類可以分為4類。1.基本型別 atomicinteger,atomiclong,atomicboolean 2.陣列型別 atomicintegerarray,atomiclongarray,atomicreferenc...

java 多執行緒 原子操作 一

對於乙個集合 需要在加入之前 執行 先檢查後執行 的步驟以達到 若沒有則新增,若有則不新增 的目的,實行多執行緒以提高效率。notthreadsafe public class listhelper 可惜的是這段 並不能保證能夠正確的完成工作,這是為什麼呢?集合和動作都已經被synchronized...