多线程教程(二十五)原子数组
常用的原子数组主要有三种:
-
AtomicIntegerArray
-
AtomicLongArray
-
AtomicReferenceArray
AtomicIntegerArray数组里面存储整型;
AtomicLongArray数组里面存储长整型;
AtomicReferenceArray数组里面存储引用类型;
举例:
/**
参数1,提供数组、可以是线程不安全数组或线程安全数组
参数2,获取数组长度的方法
参数3,自增方法,回传 array, index
参数4,打印数组的方法
*/
// supplier 提供者 无中生有 ()->结果
// function 函数 一个参数一个结果 (参数)->结果 , BiFunction (参数1,参数2)->结果
// consumer 消费者 一个参数没结果 (参数)->void, BiConsumer (参数1,参数2)->
private static <T> void demo(
Supplier<T> arraySupplier,
Function<T, Integer> lengthFun,
BiConsumer<T, Integer> putConsumer,
Consumer<T> printConsumer ) {
List<Thread> ts = new ArrayList<>();
T array = arraySupplier.get();
int length = lengthFun.apply(array);
for (int i = 0; i < length; i++) {
// 每个线程对数组作 10000 次操作
ts.add(new Thread(() -> {
for (int j = 0; j < 10000; j++) {
putConsumer.accept(array, j%length);
}
}));
}
ts.forEach(t -> t.start()); // 启动所有线程
ts.forEach(t -> {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}); // 等所有线程结束
printConsumer.accept(array);
}
上面代码用了函数式编程,函数式编程的介绍可以看博客
1.将不是线程安全的数组传入方法
demo(
()->new int[10],
(array)->array.length,
(array, index) -> array[index]++,
array-> System.out.println(Arrays.toString(array))
);
输出:
[9870, 9862, 9774, 9697, 9683, 9678, 9679, 9668, 9680, 9698]
2.将线程安全的数组传入函数
demo(
()-> new AtomicIntegerArray(10),
(array) -> array.length(),
(array, index) -> array.getAndIncrement(index),
array -> System.out.println(array)
);
结果
[10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000]
参考文献:
本文介绍了Java中三种原子数组的使用方法:AtomicIntegerArray、AtomicLongArray 和 AtomicReferenceArray,并通过示例演示了如何利用这些原子数组进行线程安全的操作。此外,还展示了如何结合函数式编程接口实现高效并发编程。
594

被折叠的 条评论
为什么被折叠?



