作者:重新入梦 | 来源:互联网 | 2023-10-11 06:07
atomic基本类型常见方法publicfinalintget()publicfinalintgetAndSet(intnewValue)publicfinalintincre
atomic基本类型
常见方法
public final int get() public final int getAndSet(int newValue)public final int incrementAndGet()public final int decrementAndGet()public final int addAndGet(int delta)//获取当前的值并加上预期的值//如果当前的值和期待值expect相同,则把当前值设置为update
public final boolean compareAndSet(int expect, int update)
atomic*FieldUpdater
代码示例
package atomic;import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;/*** 描述: 演示AtomicIntegerFieldUpdater的用法不支持对static变量的升级*/
public class AtomicIntegerFieldUpdaterDemo implements Runnable{static Candidate tom;static Candidate peter;public static AtomicIntegerFieldUpdater scoreUpdater &#61; AtomicIntegerFieldUpdater.newUpdater(Candidate.class, "score");&#64;Overridepublic void run() {for (int i &#61; 0; i <10000; i&#43;&#43;) {peter.score&#43;&#43;;scoreUpdater.getAndIncrement(tom);}}public static class Candidate {volatile int score;}public static void main(String[] args) throws InterruptedException {tom&#61;new Candidate();peter&#61;new Candidate();AtomicIntegerFieldUpdaterDemo r &#61; new AtomicIntegerFieldUpdaterDemo();Thread t1 &#61; new Thread(r);Thread t2 &#61; new Thread(r);t1.start();t2.start();t1.join();t2.join();System.out.println("普通变量&#xff1a;"&#43;peter.score);System.out.println("升级后的结果"&#43; tom.score);}
}
adder累加器
package atomic;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;/*** 描述&#xff1a; 演示高并发场景下&#xff0c;LongAdder比AtomicLong性能好*/
public class LongAdderDemo {public static void main(String[] args) throws InterruptedException {LongAdder counter &#61; new LongAdder();ExecutorService service &#61; Executors.newFixedThreadPool(20);long start &#61; System.currentTimeMillis();for (int i &#61; 0; i <10000; i&#43;&#43;) {service.submit(new Task(counter));}service.shutdown();while (!service.isTerminated()) {}long end &#61; System.currentTimeMillis();System.out.println(counter.sum());System.out.println("LongAdder耗时&#xff1a;" &#43; (end - start));}private static class Task implements Runnable {private LongAdder counter;public Task(LongAdder counter) {this.counter &#61; counter;}&#64;Overridepublic void run() {for (int i &#61; 0; i <10000; i&#43;&#43;) {counter.increment();}}}
}
为什么LongAdder比较快&#xff1f;
因为AtomicLong需要flush和refresh.让不同的线程中看见主内存的最新值。
而Adder每个线程只在自己线程中操作。