作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将在 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/
我是一名优秀的程序员,十分优秀!