国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > Java > 正文

Java中unsafe操作實(shí)例總結(jié)

2024-07-14 08:40:12
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Unsafe是Java無(wú)鎖操作的基石,在無(wú)鎖并發(fā)類(lèi)中都少不了它們的身影,比如ConcurrentHashMap, ConcurrentLinkedQueue, 都是由Unsafe類(lèi)來(lái)實(shí)現(xiàn)的。相對(duì)于與Java中的鎖,它基本無(wú)開(kāi)銷(xiāo),會(huì)原地等待。本文主要介紹下Unsafe中的主要操作。

1 compareAndSwap

/*** 比較obj的offset處內(nèi)存位置中的值和期望的值,如果相同則更新。此更新是不可中斷的。* * @param obj 需要更新的對(duì)象* @param offset obj中整型field的偏移量* @param expect 希望field中存在的值* @param update 如果期望值expect與field的當(dāng)前值相同,設(shè)置filed的值為這個(gè)新值* @return 如果field的值被更改返回true*/public native boolean compareAndSwapInt(Object obj, long offset, int expect, int update);

這個(gè)就是著名的CAS操作了,分為三步來(lái)做

  1. 獲取obj對(duì)象中為offset的偏移值,這里假設(shè)為realVal
  2. 比較realVal和expect
  3. 如果相同,將該值更新為update,否則不更新

CAS家族還包括有,compareAndSwapObject(), compareAndSwapLong(), compareAndSwapInt()等等

用AtomicInteger中一個(gè)經(jīng)典的例子來(lái)說(shuō)明:

public final int getAndAdd(int delta) {    return unsafe.getAndAddInt(this, valueOffset, delta);}//unsafe.getAndAddIntpublic final int getAndAddInt(Object var1, long var2, int var4) {  int var5;  do {  /**獲取原始值*/    var5 = this.getIntVolatile(var1, var2);  /**確認(rèn)原始值沒(méi)有被其它線程修改時(shí),再執(zhí)行更新var5+var4操作*/  } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));  return var5;}

2 putOrder

/***  * Sets the value of the integer field at the specified offset in the  * supplied object to the given value. This is an ordered or lazy  * version of <code>putIntVolatile(Object,long,int)</code>, which  * doesn't guarantee the immediate visibility of the change to other  * threads. It is only really useful where the integer field is  * <code>volatile</code>, and is thus expected to change unexpectedly.  *  * @param obj the object containing the field to modify.  * @param offset the offset of the integer field within <code>obj</code>.  * @param value the new value of the field.  * @see #putIntVolatile(Object,long,int)  */ public native void putOrderedInt(Object obj, long offset, int value);

將obj對(duì)象的偏移量為offset的位置修改為value,因?yàn)镴ava中沒(méi)有內(nèi)存操作,而Unsafe的這個(gè)操作正好補(bǔ)充了內(nèi)存操作的不足。也可以用于數(shù)組操作,比如ConcurrentHashMap中就大量用到了該操作

 Segment<K,V> s0 =    new Segment<K,V>(loadFactor, (int)(cap * loadFactor),             (HashEntry<K,V>[])new HashEntry[cap]);  Segment<K,V>[] ss = (Segment<K,V>[])new Segment[ssize];  // 往數(shù)組下標(biāo)為0的位置,寫(xiě)入s0: ss[0]=s0  UNSAFE.putOrderedObject(ss, SBASE, s0); // ordered write of segments[0]

需要注意的是obj需要設(shè)置為Volatile,否則對(duì)于其它線程會(huì)不可見(jiàn)

3 putXxxVolatile

/***  * Sets the value of the integer field at the specified offset in the  * supplied object to the given value, with volatile store semantics.  *  * @param obj the object containing the field to modify.  * @param offset the offset of the integer field within <code>obj</code>.  * @param value the new value of the field.  */ public native void putIntVolatile(Object obj, long offset, int value);

感覺(jué)和putOrderInt一樣,因?yàn)楸仨氃O(shè)置為Volatile,否則有什么用呢?

以上就是本次給大家分享的知識(shí)點(diǎn)的全部?jī)?nèi)容,感謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 龙岩市| 永济市| 吉首市| 玉林市| 德清县| 武胜县| 永嘉县| 灵山县| 新邵县| 洛川县| 青阳县| 潼关县| 筠连县| 扎鲁特旗| 浏阳市| 红安县| 麟游县| 莱西市| 鄂托克旗| 南城县| 威海市| 湖州市| 堆龙德庆县| 梧州市| 陵水| 康保县| 云浮市| 晋城| 通河县| 兴隆县| 临朐县| 巴南区| 凤阳县| 卢湾区| 寻甸| 兴国县| 正阳县| 电白县| 绿春县| 桂平市| 鲁山县|