zl程序教程

您现在的位置是:首页 >  Java

当前栏目

Java性能优化-竞争中的原子类

2023-04-18 14:22:47 时间

竞争中的原子类

1.java.util.concurrent.atomic包中的类使用了基于CAS的原语指令而不是传统的同步指令

这些类的性能比编写传统同步方法性能好,除非是极度竞争线程的场景下。

2.极度线程竞争情况下的原子类实现LongAdder

VarHandle的特性和线程本地变量的组合,分段策略

当多线程更新一个LongAdder,该类可以分别为每个线程保存更新。

这些线程不需要等待其他线程的完成操作,因为这些值本质上被存储在一个数组中,每个线程都可以快速返回。

当一个线程试图检索当前值,这些值会被累加起来。

在少竞争场景下

值会随着程序的运行而增加和传统的原子类一样的逻辑实现

在激烈竞争下——空间换时间

更新速度会更快,实例会使用更多的内存存储改值的数组

检索一个值会慢,必须先处理数组中所有待处理更新,竞争激烈下也性能高于传统原子类

LongAdder 整数累加器

public static void main(String[] args) throws InterruptedException {
        LongAdder myAdder = new LongAdder();
        Runnable incrementer1 = () -> { myAdder.increment(); };
        Runnable incrementer2 = () -> { myAdder.increment(); };

        Thread thread1 = new Thread(incrementer1);
        Thread thread2 = new Thread(incrementer2);

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.err.println("Total is " + myAdder.sum());

    }

VarHandle 内存访问接口

提供统一的内存访问接口,可以使用不同的原子性操作可变的内存地址,而不需要调用特定的硬件指令。

基于JMM实现,在编译时被转换成不同操作系统上的最优原子性代码,同时支持不同的内存屏障(volatile)。