AtomicIntegerArray是什么

可以以原子方式读取和写入的底层int数组的操作,还包含高级原子操作的并发数组类。

  1. public class Test39 {
  2. public static void main(String[] args) {
  3. demo(
  4. ()->new int[10],
  5. (array)->array.length,
  6. (array, index) -> array[index]++,
  7. array-> System.out.println(Arrays.toString(array))
  8. );
  9. demo(
  10. ()-> new AtomicIntegerArray(10),
  11. (array) -> array.length(),
  12. (array, index) -> array.getAndIncrement(index),
  13. array -> System.out.println(array)
  14. );
  15. }
  16. /**
  17. 参数1,提供数组、可以是线程不安全数组或线程安全数组
  18. 参数2,获取数组长度的方法
  19. 参数3,自增方法,回传 array, index
  20. 参数4,打印数组的方法
  21. */
  22. // supplier 提供者 无中生有 ()->结果
  23. // function 函数 一个参数一个结果 (参数)->结果 , BiFunction (参数1,参数2)->结果
  24. // consumer 消费者 一个参数没结果 (参数)->void, BiConsumer (参数1,参数2)->
  25. private static <T> void demo(
  26. Supplier<T> arraySupplier,
  27. Function<T, Integer> lengthFun,
  28. BiConsumer<T, Integer> putConsumer,
  29. Consumer<T> printConsumer ) {
  30. List<Thread> ts = new ArrayList<>();
  31. T array = arraySupplier.get();
  32. int length = lengthFun.apply(array);
  33. for (int i = 0; i < length; i++) {
  34. // 每个线程对数组作 10000 次操作
  35. ts.add(new Thread(() -> {
  36. for (int j = 0; j < 10000; j++) {
  37. putConsumer.accept(array, j%length);
  38. }
  39. }));
  40. }
  41. ts.forEach(t -> t.start()); // 启动所有线程
  42. ts.forEach(t -> {
  43. try {
  44. t.join();
  45. } catch (InterruptedException e) {
  46. e.printStackTrace();
  47. }
  48. }); // 等所有线程结束
  49. printConsumer.accept(array);
  50. }
  51. }

[8466, 8487, 8328, 8255, 8230, 8201, 8197, 8166, 8321, 8493] [10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000]