并发计算器
有些时候不想用原子操作类但还想实现安全的计算,可以使用并发计算器,有两种计算器:
- 累加器:
DoubleAccumulator
、LongAccumulator
(需要初始化) - 加法器:
DoubleAdder
、LongAdder
public class Main {
public static void main(String[] args) throws Exception {
DoubleAccumulator da = new DoubleAccumulator(Double::sum, 12);
da.accumulate(100);
System.out.println(da.get());
LongAdder longAdder = new LongAdder();
longAdder.add(10);
longAdder.add(20);
longAdder.add(30);
System.out.println(longAdder.longValue());
}
}
ThreadLocalRandom
用于解决不同线程之间使用不同的随机因子,相当于此类为每个线程提供了一个随机因子,也就是new Ramdom()
public class Main {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 3; i ++) {
new Thread(() -> {
for (int j = 0; j < 3; j ++) {
System.out.printf("%s: %d\n",
Thread.currentThread().getName(),
ThreadLocalRandom.current().nextInt(100));
}
}).start();
}
}
}
Thread-0: 67
Thread-1: 29
Thread-1: 17
Thread-1: 96
Thread-2: 27
Thread-2: 0
Thread-2: 2
Thread-0: 44
Thread-0: 7