Interpretacja „reguły kolejności programów” w współbieżności Java
Reguła porządku programu stwierdza: „Każda akcja w wątku ma miejsce - przed każdą czynnością w tym wątku, która pojawia się później w kolejności programu”
1. Czytam w innymwątek że toakcja jest
czyta i zapisuje do zmiennychzamki i odblokowania monitorówuruchamianie i łączenie za pomocą niciCzy to oznacza, że odczyt i zapis mogą być zmieniane w kolejności, ale odczyt i zapis nie mogą zmienić kolejności z działaniami określonymi w drugiej lub trzeciej linii?
2. Co oznacza „kolejność programów”?
Wyjaśnienie z przykładami byłoby naprawdę pomocne.
Dodatkowe powiązane pytanie
Załóżmy, że mam następujący kod:
long tick = System.nanoTime(); //Line1: Note the time
//Block1: some code whose time I wish to measure goes here
long tock = System.nanoTime(); //Line2: Note the time
Po pierwsze, jest to aplikacja z pojedynczym wątkiem, która zapewnia prostotę obsługi. Kompilator zauważa, że musi dwukrotnie sprawdzić czas, a także zauważa blok kodu, który nie jest zależny od otaczających linii notowania, więc widzi potencjał do reorganizacji kodu, co może spowodować, że blok 1 nie będzie otoczony przez wywołania czasowe podczas rzeczywistego wykonywania (na przykład rozważ tę kolejność Line1-> Line2-> Block1). Ale jako programista widzę zależność między liniami 1,2 i blokiem 1. Linia1 powinna bezpośrednio poprzedzać blok1, blok1 zajmuje skończoną ilość czasu, aby zakończyć, i od razu przechodzi do linii2.
Więc moje pytanie brzmi: czy prawidłowo mierzę blok?
Jeśli tak, to co uniemożliwia kompilatorowi zmianę kolejności.Jeśli nie, (co jest słuszne po przeczytaniu odpowiedzi Enno), co mogę zrobić, aby temu zapobiec.P.S: Ukradłem ten kodinne pytanie Zapytałem niedawno w SO.