Odnosząc się do http://www.javamex.com/tutorials/synchronization_volatile.shtml, nie jestem pewien, czy muszę użyć słowa kluczowego volatile
w następującym przypadku: z powodu dodatkowej reguły 3.Czy muszę używać lotnych, jeśli 2 różne nicki zapisu i odczytu nigdy nie będą żyły w tym samym czasie?
- prymitywny zmienna statyczna będzie pisać wątku A.
- tej samej zmiennej statycznej prymitywny zostanie odczytany przez Thread B.
- wątek B będzie działać tylko po wątku A jest „martwy ". ("martwy" oznacza, że ostatnie stwierdzenie końca pustej nici A zostało zakończone)
Czy nowa wartość zapisana w wątku A zawsze zostanie przypisana do pamięci głównej, po "martwej"? Jeśli tak, czy to oznacza, że nie potrzebuję słowa kluczowego, jeśli powyższe 3 warunki są spełnione?
Mam wątpliwości, czy w tym przypadku wymagana jest volatile
. Ponieważ jest to wymagane, może zostać zerwana ArrayList. Jako jeden wątek można wykonać wstawianie i aktualizowanie zmiennej składowej size
. Później inny wątek (nie współbieżnie) może odczytać 's . Jeśli spojrzysz na kod źródłowy ArrayList
, size
nie jest zadeklarowany jako niestabilny.
W JavaDoc z ArrayList
, to tylko wspomnieć, że ArrayList
nie jest bezpieczny do stosowania na wiele wątków dostęp ArrayList instancji jednocześnie, ale nie dla wiele wątków dostęp ArrayList instancji w różnych terminów.
Pozwól mi użyć następującego kodu do issulate ten problem
public static void main(String[] args) throws InterruptedException {
// Create and start the thread
final ArrayList<String> list = new ArrayList<String>();
Thread writeThread = new Thread(new Runnable() {
public void run() {
list.add("hello");
}
});
writeThread.join();
Thread readThread = new Thread(new Runnable() {
public void run() {
// Does it guarantee that list.size will always return 1, as this list
// is manipulated by different thread?
// Take note that, within implementation of ArrayList, member
// variable size is not marked as volatile.
assert(1 == list.size());
}
});
readThread.join();
}
Oczywistym pytaniem byłoby, dlaczego ktoś użył 2 wątków? Tylko akademicki? –