我有一个1000 * 1000的表和几个线程正在处理它。每个线程在表的某个部分独立工作,并且每次迭代时它们的“工作”在表上移动。
我希望只锁定每个线程所需的单元格,而不是在其他人等待时锁定整个表。 所以我希望为每个线程锁定所需的“块”单元格。
我的想法是创建一个锁定表,如:Lock [][]gridLock=new Lock[1000][1000];
并锁定每个线程所需的单元格。
这将伴随gridlock(x,y,diameter)
和gridUnlock(x,y,diameter)
方法来锁定/取消所需的单元格。
有没有更好的方法来实现这一目标,还是这种方法合适?
答案 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。