Có bất kỳ vấn đề đồng thời nào với một chuỗi đọc từ một chỉ mục của một mảng hay không, trong khi một luồng khác ghi vào một chỉ mục khác của mảng, miễn là các chỉ mục khác nhau?java array thread-safety
ví dụ: (Ví dụ này không nhất thiết phải đề nghị cho sử dụng thực tế, chỉ để minh họa cho quan điểm của tôi)
class Test1
{
static final private int N = 4096;
final private int[] x = new int[N];
final private AtomicInteger nwritten = new AtomicInteger(0);
// invariant:
// all values x[i] where 0 <= i < nwritten.get() are immutable
// read() is not synchronized since we want it to be fast
int read(int index) {
if (index >= nwritten.get())
throw new IllegalArgumentException();
return x[index];
}
// write() is synchronized to handle multiple writers
// (using compare-and-set techniques to avoid blocking algorithms
// is nontrivial)
synchronized void write(int x_i) {
int index = nwriting.get();
if (index >= N)
throw SomeExceptionThatIndicatesArrayIsFull();
x[index] = x_i;
// from this point forward, x[index] is fixed in stone
nwriting.set(index+1);
}
}
chỉnh sửa: phê bình ví dụ này không phải là câu hỏi của tôi, tôi theo nghĩa đen chỉ muốn biết nếu truy cập mảng tới một chỉ số, đồng thời để truy cập của một chỉ mục khác, đặt ra các vấn đề đồng thời, không thể nghĩ ra một ví dụ đơn giản.
cảm ơn ... drat, tôi muốn sử dụng mảng byte [] và có vẻ như không có động vật nguyên tử nào như vậy .... Tôi đoán tôi sẽ chỉ sử dụng các phương pháp đồng bộ và giữ nó đơn giản. –
Nếu bạn có nhiều lần đọc hơn viết, bạn có thể muốn xem java.util.concurrent.locks.ReadWriteLock –
huh, thú vị ... –