多个线程访问矩阵

时间:2014-11-12 17:13:38

标签: java multithreading

我在java中实现了一个多线程程序,其中线程可以同时输入行或列。

示例代码,显示我怀疑的非常小的片段:

public void checkRow(int row){

  for(int j = 0; j < numberOfColumns;i++){
        if(matrix[row][j]...)
  }

}

public void checkColumn(int column){
  for(int i = 0; i < numberOfRows;i++){
         if(matrix[i][column]...)
  }

}

我有两个独立的线程循环

public void run(){

   matrixClass.checkRow(2);
}

public void run(){

   matrixClass.checkColumn(3);
}

我的问题是,我只是在阅读矩阵,所以如果线程例如到达同一个桶,那么会发生什么错误?

提前感谢。

3 个答案:

答案 0 :(得分:2)

只要您正在阅读矩阵,它就可以了,但是,假设已经安全地初始化并且不允许修改。

答案 1 :(得分:1)

不可变对象是线程安全的。但是有additional pitfalls / cases where Thread sychronization may be needed

答案 2 :(得分:0)

  

...如果例如线程到达相同的存储桶会发生错误吗?

当然,在行和列的交叉处有一个单元格,并且两个线程必须访问该单元格,所以你必须要问,&#34;如果它们会发生什么尝试同时读取单元格

现代计算机架构的设计方式是我们永远不必同时说的。&#34;如果发生两个事件E和F,则三种可能性是; (1)我们可以证明E发生在F之前,或者(2)我们可以证明F发生在E之前,或者(3)我们不能证明任何一个发生在另一个之前。

如果软件和硬件设计都正确,那么系统将永远不会进入一个状态,在这种情况下,您无法证明哪个事件首先发生,除非哪个事件先发生并不重要。

假设您的两个线程在两个不同的CPU上运行。如果这些CPU中至少有一个已经在其自己的本地缓存中具有该单元的值,则该CPU可以从缓存中读取该值,而另一个CPU从缓存或从内存中获取值。你不可能首先证明哪一个发生了,但它不重要,因为两个线程都会得到正确的值。

如果两个CPU都没有缓存中的值,那么他们都必须使用系统总线从主内存中获取值。一次只能有一个CPU使用总线。硬件设计人员知道如何证明当两个或多个CPU试图使用总线之间的数据竞争时,其中一个将总是赢得比赛,而其他人将被推迟。所有的CPU最终都将使用总线,但它们使用它的顺序是不可预测的(无法提供)。

数据竞争在某些程序中可能是一个问题,但如果程序设计正确,那么它就不重要了。

在你的情况下,程序设计正确,只要没有其他线程你没有告诉我们写入单元格。如果每个人都只阅读单元格,那么即使你不知道/不能证明他们阅读单元格的顺序,每个人最终都会得到相同的答案。