【发布时间】:2015-11-22 11:18:05
【问题描述】:
我正在尝试编写 synccollection 我因读/写问题而崩溃了
我在每个线程中运行这段代码
public void run() {
for (int j = 0; j < threadElemAmount; j++) {
list.remove((int) (list.size() - 1));
}
}
方法内部的代码大小和运行
public T remove(int index){
lock.lock();
if (index >= size || index < 0)
throw new IndexOutOfBoundsException("illegal index value, index = " + index + " size = " + size);
T removedElement = (T) data[index];
int movedElementsAmount = size - index - 1;
//проверить кол-во перемещаемых элементов справа
if (movedElementsAmount > 0) {
System.arraycopy(data, index + 1, data, index, movedElementsAmount);
}
// очищаем последний
data[--size] = null;
lock.unlock();
return removedElement;
}
和大小
public int size() {
lock.lock();
int result = size;
lock.unlock();
return result;
}
我不能使用同步关键字这是特殊情况的一部分,只是锁定,几乎相同。
因此,最薄弱的地方是 list.size() 调用和 list.remove() 调用之间的 ulocked 空间。如何避免读/写问题?
【问题讨论】:
标签: java multithreading thread-safety read-write