我使用int数组。 我使用该方法填充数组中的索引。
public void makeSelectionOfGivenNumber(int number) throws InterruptedException {
if (this.table[number]!= 0) {
int multiple;
multiple = number+number;
while (multiple<=upperRange) {
this.table[multiple]=0;
multiple += number;
}
}
}
例如,一个线程从2开始,并且所有的复制都是elimenates,第二个线程从5开始,并进行相同的活动。在某些情况下,同时索引10中的值(在两种情况下都是倍数)。如何在这种情况下使用信号量或其他工具来锁定只有一个线程可以访问特定索引,而不是整个数组。我希望这两个线程可以在同一个表上工作。
答案 0 :(得分:1)
我认为您需要创建一个额外的锁数组(ReadWriteLock,数组的维度是您想要的),并且在每次尝试读取/更改目标数组之前锁定读取或写入元素进入阵列。要获取锁需要从目标数组的所需索引和附加数组的容量计算索引。
也许我没有完全理解任务
public class SomeTask {
private final ReadWriteLock[] locks = locks(5);
private int[] table;
private int upperRange;
public SomeTask(int[] table, int upperRange) {
this.table = table;
this.upperRange = upperRange;
}
public void makeSelectionOfGivenNumber(int number) {
if (this.table[number] != 0) {
int multiple;
multiple = number + number;
while (multiple <= upperRange) {
ReadWriteLock lock = getLock(multiple);
try {
lock.writeLock().lock();
this.table[multiple] = 0;
} finally {
lock.writeLock().unlock();
}
multiple += number;
}
}
}
private ReadWriteLock getLock(int number) {
return locks[(locks.length - 1) & number];
}
private ReadWriteLock[] locks(int size) {
ReadWriteLock[] result = new ReadWriteLock[size];
for (int i = 0; i < size; i++) {
result[i] = new ReentrantReadWriteLock();
}
return result;
}