Czy są jakieś problemy dotyczące współbieżności z jednym wątkiem odczytu z jednego indeksu tablicy, podczas gdy inny wątek zapisuje do innego indeksu tablicy, o ile indeksy są różne?java array thread-safety
np. (Ten przykład nie koniecznie zalecany do rzeczywistego użytkowania, tylko zilustrować mój punkt widzenia)
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);
}
}
edit: krytyce ten przykład nie jest moja sprawa, ja dosłownie po prostu chcesz wiedzieć, czy tablicową dostęp do jednego indeksu, równolegle do dostęp do innego indeksu, stwarza problemy współbieżności, nie mógł wymyślić prostego przykładu.
dzięki ... drat, chciałem użyć tablicy byte [] i wygląda na to, że nie ma takiego zwierzęcia atomowego .... Myślę, że po prostu użyję zsynchronizowanych metod i utrzymam to w prostocie. –
Jeśli masz dużo więcej odczytów niż zapisów, możesz zajrzeć do java.util.concurrent.locks.ReadWriteLock –
huh, interesujący ... –