java中的多线程访问

时间:2016-11-28 18:22:16

标签: java arrays multithreading

我有一个1000 * 1000的表和几个线程正在处理它。每个线程在表的某个部分独立工作,并且每次迭代时它们的“工作”在表上移动。

我希望只锁定每个线程所需的单元格,而不是在其他人等待时锁定整个表。 所以我希望为每个线程锁定所需的“块”单元格。

我的想法是创建一个锁定表,如:Lock [][]gridLock=new Lock[1000][1000];并锁定每个线程所需的单元格。

这将伴随gridlock(x,y,diameter)gridUnlock(x,y,diameter)方法来锁定/取消所需的单元格。

有没有更好的方法来实现这一目标,还是这种方法合适?

2 个答案:

答案 0 :(得分:0)

不鼓励对单个对象进行并发访问,因为这会产生大量问题。最大的问题是,当线程正在处理它时,对象可以改变状态,这可能会破坏其他线程。

如果可能的话,我会在每个线程上运行它自己的对象,逐个构建表,一旦完成所有线程,就构造最终表。这将隔离所有线程并避免不必要的并发问题。

如果上述方法不可行。我会尽量保持线程尽可能独立,并尽可能地隔离表数据。为每个线程在表中提供一组行以进行处理,这将确保没有线程修改表的相同部分。然后每个线程可以修改它所分配的行中的单元格。

答案 1 :(得分:0)

谢谢! 我不知道我推断的方式是否正确,但这就是我所做的: 我有我的锁矩阵:Lock [] [] gridLock = new Lock [1000] [1000]。

但是,不是在开头u_u初始化整个1百万的锁定,而是仅在需要时才这样做,例如:

public void lockAround(x, y, diameter){
[...] 
for{for{ //i and j <1000
    gridLock[i][j]=new ReentrantLock();
    gridLock[i][j].lock();
}}
}


当我在unlockAround(x,y,diameter)方法中解锁时,我将它们设置为null。