W Javie zachowanie niepoprawnie zsynchronizowanego programu można uznać za niezdefiniowane.
JLS Java 7 używa słowa „niezdefiniowany” jeden raz, w 17.4.8. Wymogi wykonania i związku przyczynowego :
Używamy f|d
do oznaczenia funkcji podanej przez ograniczenie domeny f
do d
. Dla wszystkich x
w d
, f|d(x) = f(x)
i dla wszystkich x
nie w d
, f|d(x)
jest niezdefiniowany ...
Dokumentacja interfejsu API Java określa niektóre przypadki, w których wyniki są niezdefiniowane - na przykład w (przestarzałym) Konstruktorze Data (int rok, int miesiąc, int dzień) :
Wynik jest niezdefiniowany, jeśli dany argument jest poza zakresem ...
Stan Javadocs dla ExecutorService.invokeAll (kolekcja) :
Wyniki tej metody są niezdefiniowane, jeśli dana kolekcja zostanie zmodyfikowana podczas wykonywania tej operacji ...
Mniej formalny rodzaj „niezdefiniowanego” zachowania można znaleźć na przykład w ConcurrentModificationException , gdzie dokumenty API używają terminu „najlepszy wysiłek”:
Należy pamiętać, że nie można zagwarantować szybkiego działania w przypadku awarii, ponieważ generalnie mówiąc, niemożliwe jest ustanowienie jakichkolwiek twardych gwarancji w przypadku niezsynchronizowanej jednoczesnej modyfikacji. Bezawaryjne operacje ConcurrentModificationException
zapewniają najlepsze starania . Dlatego błędem byłoby napisanie programu, który był uzależniony od tego wyjątku pod względem poprawności ...
dodatek
Jeden z komentarzy do pytania odnosi się do artykułu Erica Lipperta, który zawiera pomocne wprowadzenie do zagadnień tematycznych: zachowanie zdefiniowane w ramach implementacji .
Polecam ten artykuł do rozumowania niezależnego od języka, chociaż warto pamiętać, że autor celuje w C #, a nie w Javę.
Tradycyjnie mówimy, że idiom języka programowania ma niezdefiniowane zachowanie, jeśli użycie tego idiomu może mieć jakikolwiek wpływ; może działać tak, jak tego oczekujesz, może wymazać dysk twardy lub spowodować awarię komputera. Ponadto autor kompilatora nie jest zobowiązany do ostrzegania o niezdefiniowanym zachowaniu. (W rzeczywistości istnieją języki, w których programy używające idiomów „niezdefiniowane zachowanie” są dozwolone przez specyfikację języka, aby spowodować awarię kompilatora!) ...
Natomiast idiomem, który ma zachowanie zdefiniowane w implementacji, jest zachowanie, w którym autor kompilatora ma kilka możliwości zaimplementowania funkcji i musi wybrać jedną. Jak sama nazwa wskazuje, zachowanie zdefiniowane w implementacji jest co najmniej zdefiniowane. Na przykład C # pozwala implementacji na zgłoszenie wyjątku lub wygenerowanie wartości, gdy przepełni się dzielenie liczb całkowitych, ale implementacja musi wybrać jeden. Nie może usunąć twojego dysku twardego ...
Jakie są niektóre czynniki, które skłoniły komisję ds. Projektowania języków do pozostawienia określonych idiomów językowych jako zachowań niezdefiniowanych lub zdefiniowanych w implementacji?
Pierwszym ważnym czynnikiem jest: czy istnieją dwie implementacje języka na rynku, które nie zgadzają się z zachowaniem konkretnego programu? ...
Kolejnym ważnym czynnikiem jest: czy ta funkcja w naturalny sposób oferuje wiele różnych możliwości wdrożenia, z których niektóre są wyraźnie lepsze od innych? ...
Trzecim czynnikiem jest: czy cecha jest tak złożona, że jej szczegółowe rozbicie byłoby trudne lub kosztowne? ...
Czwarty czynnik to: czy funkcja nakłada duże obciążenie na analizator kompilatora? ...
Piąty czynnik to: czy ta funkcja powoduje duże obciążenie środowiska wykonawczego? ...
Szósty czynnik to: czy zdefiniowanie określonego zachowania wyklucza jakąś poważną optymalizację? ...
To tylko kilka czynników, które przychodzą na myśl; jest oczywiście wiele, wiele innych czynników, które komitety projektowania języków dyskutują przed wprowadzeniem funkcji „zdefiniowano wdrożenie” lub „nie zdefiniowano”.
Powyżej jest tylko bardzo krótki opis; pełny artykuł zawiera wyjaśnienia i przykłady punktów wymienionych w tym fragmencie; jest wiele warte czytania. Na przykład szczegóły podane dla „szóstego czynnika” mogą dać wgląd w motywację wielu stwierdzeń w Java Memory Model ( JSR 133 ), pomagając zrozumieć, dlaczego niektóre optymalizacje są dozwolone, prowadząc do nieokreślonego zachowania, podczas gdy inne są zabronione, co prowadzi do ograniczenia, takie jak wcześniejsze zdarzenia i wymagania dotyczące przyczynowości .
Żaden z artykułów nie jest dla mnie szczególnie nowy, ale niech mnie szlag, jeśli kiedykolwiek zobaczyłem, że jest prezentowany w tak elegancki, spójny i zrozumiały sposób. Niesamowity.