gpt4 book ai didi

java - 我的共享类是线程安全的吗?

转载 作者:行者123 更新时间:2023-11-29 03:21:51 27 4
gpt4 key购买 nike

我将在 Java 中的多个线程之间共享一个 Matrix 类。矩阵类是: https://github.com/vkostyukov/la4j/blob/master/src/main/java/org/la4j/matrix/sparse/CRSMatrix.java

我要调用的唯一方法是获取由以下代码定义的行:

@Override
public Vector getRow(int i) {

int rowCardinality = rowPointers[i + 1] - rowPointers[i];

double rowValues[] = new double[rowCardinality];
int rowIndices[] = new int[rowCardinality];

System.arraycopy(values, rowPointers[i], rowValues, 0, rowCardinality);
System.arraycopy(columnIndices, rowPointers[i], rowIndices,
0, rowCardinality);

return new CompressedVector(columns, rowCardinality, rowValues,
rowIndices);
}

所以它是只读的。您能否帮助我了解这是否会导致我的多线程程序出现问题,或者我是否需要使用同步或锁?

最佳答案

我没有深入研究,但查看您的代码我可以看到这 3 个实例字段:

private double values[];
private int columnIndices[];
private int rowPointers[];

共享(因为它们是实例字段)。这意味着,如果您提供一种方法 来改变它们,您可能会遇到问题。我的意思是,您在一个线程中调用 getRow,而另一个线程更改它们的内容。当然,您可能会遇到问题。

如果您不更改它们(您只需要在创建时知道它们),请将它们设为最终状态并在您的构造函数中设置它们。并且不提供任何改变它们内容的手段(方法),从而使类不可变;因此是线程安全的。

否则很简单,让你的方法同步。

此外,您将共享一个实例,而不是类。还有一点,它始终是关于共享数据的作者而不是读者。作家改变了你的例子,而不是读者。

关于java - 我的共享类是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23141029/

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