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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK提供的原子类原理与使用

發(fā)布時間:2025/4/9 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK提供的原子类原理与使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原子更新基本類型

原子更新數(shù)組

原子更新抽象類型

原子更新字段

?

?

原子更新基本類型:

package com.roocon.thread.t8;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;

public class Sequence {
private AtomicInteger value = new AtomicInteger(0);
private int [] s = {2,1,4,6};
AtomicIntegerArray a = new AtomicIntegerArray(s);

public int getNext(){
a.getAndIncrement(2);//給下標(biāo)為2的元素加1
a.getAndAdd(2, 10);//獲取下標(biāo)為2的元素,并且加10
for (int i=0; i < a.length(); i++){
System.out.println(a.get(i));
}
return value.getAndIncrement();
}

public static void main(String[] args) {
Sequence sequence = new Sequence();
new Thread(new Runnable() {
@Override
public void run() {
while (true){
System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true){
System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true){
System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}

運行結(jié)果:

Thread-0 0 Thread-1 1 Thread-2 2 Thread-0 3 Thread-1 4 Thread-2 5 ...

?

?

package com.roocon.thread.t8;import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicIntegerArray; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.atomic.AtomicReference;public class Sequence {private AtomicInteger value = new AtomicInteger(0);AtomicReference<User> user = new AtomicReference<>(); //對user的set和get執(zhí)行原子操作AtomicIntegerFieldUpdater<User> old = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");public int getNext(){User user = new User();System.out.println(old.getAndIncrement(user));System.out.println(old.getAndIncrement(user));System.out.println(old.getAndIncrement(user));return value.getAndIncrement();}public static void main(String[] args) {Sequence sequence = new Sequence();new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}).start();} }

運行結(jié)果:

0 1 2 Thread-0 0

?

?

對CAS的源碼理解:--初步理解

在AtomicInteger中有這樣一段源碼:

public final int getAndUpdate(IntUnaryOperator updateFunction) {int prev, next;do {prev = get();next = updateFunction.applyAsInt(prev);} while (!compareAndSet(prev, next));return prev;}

public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
} ?

其中,compareAndSwap就是CAS的縮寫。如果prev和next不相等,則返回true。否則,返回false。最終是通過unsafe來實現(xiàn)的。

以上代碼表示,如果compareAndSet返回true,則while條件為false,退出循環(huán),返回prev值。如果compareAndSet返回false,則while為true,繼續(xù)執(zhí)行循環(huán)體,重新獲取prev的值,重新獲取更新值,直到返回的compareAndSet值為true。

演示源碼大致步驟如下:

Object prev = get(); //1next = prev + 1;boolean flag = cas(prev, next);if (flag) {return prev;}else {go to 1}

?

轉(zhuǎn)載于:https://www.cnblogs.com/sunnyDream/p/8137588.html

總結(jié)

以上是生活随笔為你收集整理的JDK提供的原子类原理与使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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