gpt4 book ai didi

Java:填充矩阵多线程,目前无线程安全

转载 作者:行者123 更新时间:2023-12-02 11:38:30 26 4
gpt4 key购买 nike

我对多线程非常陌生,但我想我或多或少有了总体的想法。我正在尝试以多线程方式填充矩阵,但我的代码显然不是线程安全的,我的矩阵中有重复的列,而定期填充矩阵时则不是这种情况。下面是一个示例代码块。请注意,reader 是一个 Scanner 对象,someOperationOnText(someText) 返回一个 int[100] 对象。

    int[][] mat = new int[100][100];
ExecutorService threadPool = Executors.newFixedThreadPool(8);

for (int i = 0; i < 100; i++) {
Set<Integer>someText = new HashSet<>(reader.next());
int lineIndex = i;
threadPool.submit(() -> mat[lineIndex] = someOperationOnText(someText);
}

您是否明白这不是线程安全的任何原因?我似乎无法理解它,因为读取是在线程池之外完成的,我认为它不会有风险。

非常感谢您提供任何调试技巧!GRTS

最佳答案

submit 调用和执行程序线程池中的线程执行 lambda 之间存在一个happens-before。 (参见javadoc:“内存一致性影响”)。因此,这意味着 lambda 将看到 someTextmatlineIndex 的正确值。

唯一不线程安全的是在主线程中使用 mat 中的值的(隐含)代码。在执行器上调用 shutdown() 应该就足够了......尽管 javadoc 没有讨论 shutdown()awaitTermination() 的内存一致性影响.

(根据我对 ThreadPoolExecutor 的 code 的阅读,awaitTermination() 方法在池线程之间提供了一个happens-before (完成所有任务后)和方法的返回。发生之前是由于使用执行程序的主锁来同步池关闭。很难看出他们如何在没有这个(或同等的),所以它不仅仅是一个“实现工件”......我认为。)

关于Java:填充矩阵多线程,目前无线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48742360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com