建设手机网站费用吗/预测2025年网络营销的发展
竞争中的原子类
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)。