In Java können Sie das Verhalten eines falsch synchronisierten Programms als undefiniert betrachten.
Java 7 JLS verwendet das Wort "undefined" in 17.4.8 einmal. Ausführungs- und Kausalitätsanforderungen :
Wir f|d
bezeichnen die gegebene Funktion mit der Einschränkung der Domäne von f
to d
. Für alle x
in d
, f|d(x) = f(x)
und für alle x
nicht in d
, f|d(x)
ist undefiniert ...
In der Java-API-Dokumentation werden einige Fälle angegeben, in denen die Ergebnisse nicht definiert sind, z. B. im (veralteten) Konstruktor Datum (int Jahr, int Monat, int Tag) :
Das Ergebnis ist undefiniert, wenn ein gegebenes Argument außerhalb der Grenzen liegt ...
Javadocs für ExecutorService.invokeAll (Collection) -Status :
Die Ergebnisse dieser Methode sind nicht definiert, wenn die angegebene Auflistung geändert wird, während dieser Vorgang ausgeführt wird.
Weniger formales "undefiniertes" Verhalten ist beispielsweise in ConcurrentModificationException zu finden , wo API-Dokumente den Begriff "best effort" verwenden:
Beachten Sie, dass das Fail-Fast-Verhalten nicht garantiert werden kann, da es im Allgemeinen unmöglich ist, bei nicht synchronisierten gleichzeitigen Änderungen eine harte Garantie zu geben. Fehlgeschlagene Operationen werden ConcurrentModificationException
nach besten Kräften ausgeführt . Daher wäre es falsch, ein Programm zu schreiben, dessen Korrektheit von dieser Ausnahme abhängt ...
Blinddarm
Eines der Frage Kommentare bezieht sich auf einen Artikel von Eric Lippert , die in Thema Fragen hilfreiche Einführung bietet: die Implementierung definiert Verhalten .
Ich empfehle diesen Artikel für sprachunabhängige Überlegungen, obwohl es sich zu bedenken lohnt, dass der Autor auf C # und nicht auf Java abzielt.
Traditionell sagen wir, dass ein Programmiersprachen-Idiom undefiniertes Verhalten hat, wenn die Verwendung dieses Idioms irgendeinen Effekt haben kann; Es kann so funktionieren, wie Sie es erwarten, oder es kann Ihre Festplatte löschen oder Ihren Computer zum Absturz bringen. Darüber hinaus ist der Autor des Compilers nicht verpflichtet, Sie vor dem undefinierten Verhalten zu warnen. (Tatsächlich gibt es einige Sprachen, in denen die Sprachspezifikation zulässt, dass Programme, die "undefiniertes Verhalten" verwenden, den Compiler zum Absturz bringen!) ...
Im Gegensatz dazu ist ein Idiom mit implementierungsdefiniertem Verhalten ein Verhalten, bei dem der Compilerautor mehrere Möglichkeiten zur Implementierung des Features hat und eine auswählen muss. Wie der Name schon sagt, ist das implementierungsdefinierte Verhalten zumindest definiert. Mit C # kann eine Implementierung beispielsweise eine Ausnahme auslösen oder einen Wert erzeugen, wenn eine Ganzzahldivision überläuft, die Implementierung muss jedoch eine auswählen. Es kann Ihre Festplatte nicht löschen ...
Was sind einige der Faktoren, die ein Sprachdesign-Komitee veranlassen, bestimmte Sprachidiome als undefiniertes oder durch die Implementierung definiertes Verhalten zu belassen?
Der erste Hauptfaktor ist: Gibt es zwei auf dem Markt vorhandene Implementierungen der Sprache, die sich nicht auf das Verhalten eines bestimmten Programms einigen? ...
Der nächste wichtige Faktor ist: Bietet das Feature natürlich viele verschiedene Implementierungsmöglichkeiten, von denen einige deutlich besser sind als andere? ...
Ein dritter Faktor ist: Ist das Merkmal so komplex, dass eine detaillierte Aufschlüsselung seines genauen Verhaltens schwierig oder teuer zu spezifizieren wäre? ...
Ein vierter Faktor ist: Bedeutet das Feature eine hohe Belastung für den Compiler bei der Analyse? ...
Ein fünfter Faktor ist: Belastet die Funktion die Laufzeitumgebung in hohem Maße? ...
Ein sechster Faktor ist: Schliesst das Definieren des Verhaltens eine wesentliche Optimierung aus? ...
Dies sind nur einige Faktoren, die mir einfallen. Es gibt natürlich viele, viele andere Faktoren, die von Sprachdesign-Komitees diskutiert werden, bevor ein Feature als "Implementierung definiert" oder "undefiniert" definiert wird.
Oben ist nur eine sehr kurze Darstellung; Der vollständige Artikel enthält Erläuterungen und Beispiele zu den in diesem Auszug genannten Punkten. es ist viel lesenswert. Zum Beispiel können Details, die für den "sechsten Faktor" angegeben wurden, einen Einblick in die Motivation für viele Aussagen im Java Memory Model ( JSR 133 ) geben und dabei helfen, zu verstehen, warum einige Optimierungen zulässig sind, was zu undefiniertem Verhalten führt, während andere verboten sind und dazu führen Einschränkungen wie Vorgängervorgänge und Kausalitätsanforderungen .
Keines der Artikelmaterialien ist für mich besonders neu, aber ich werde verdammt sein, wenn ich es jemals so elegant, präzise und verständlich präsentiert habe. Tolle.