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ą nici

Czy 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.

questionAnswers(5)

yourAnswerToTheQuestion