En Java, vous pouvez considérer que le comportement d'un programme mal synchronisé n'est pas défini.
Java 7 JLS utilise le mot "non défini" une fois, en 17.4.8. Exécutions et conditions de causalité :
Nous utilisons f|d
pour désigner la fonction donnée en restreignant le domaine de f
à d
. Pour tous x
dans d
, f|d(x) = f(x)
et pour tous les x
pas d
, f|d(x)
est indéfini ...
La documentation de l'API Java spécifie certains cas où les résultats ne sont pas définis - par exemple, dans le constructeur (obsolète) Date (int année, mois int, jour int) :
Le résultat n'est pas défini si un argument donné est hors limites ...
État des Javadocs pour ExecutorService.invokeAll (Collection) :
Les résultats de cette méthode ne sont pas définis si la collection donnée est modifiée pendant que cette opération est en cours ...
Un type moins formel de comportement "non défini" peut être trouvé par exemple dans ConcurrentModificationException , où les documents API utilisent le terme "meilleur effort":
Notez que le comportement de défaillance rapide ne peut pas être garanti car il est généralement impossible de faire des garanties dures en présence d'une modification simultanée non synchronisée. Les opérations rapides échouent ConcurrentModificationException
au mieux . Par conséquent, il serait erroné d'écrire un programme qui dépend de cette exception pour sa justesse ...
appendice
L'un des commentaires de la question fait référence à un article d'Eric Lippert qui fournit une introduction utile aux sujets: le comportement défini par l'implémentation .
Je recommande cet article pour le raisonnement indépendant du langage, même s'il convient de garder à l'esprit que l'auteur cible C #, pas Java.
Traditionnellement, nous disons qu'un idiome de langage de programmation a un comportement indéfini si l'utilisation de cet idiome peut avoir un quelconque effet; il peut fonctionner comme vous le souhaitez ou il peut effacer votre disque dur ou planter votre machine. De plus, l'auteur du compilateur n'a aucune obligation de vous avertir du comportement indéfini. (Et en fait, il existe des langages dans lesquels les programmes qui utilisent des idiomes de "comportement indéfini" sont autorisés par la spécification du langage à planter le compilateur!) ...
En revanche, un idiome qui a un comportement défini par l'implémentation est un comportement où l'auteur du compilateur a plusieurs choix sur la façon d'implémenter la fonctionnalité et doit en choisir un. Comme son nom l'indique, le comportement défini par l'implémentation est au moins défini. Par exemple, C # permet à une implémentation de lever une exception ou de produire une valeur lorsqu'une division entière déborde, mais l'implémentation doit en choisir une. Il ne peut pas effacer votre disque dur ...
Quels sont certains des facteurs qui poussent un comité de conception linguistique à laisser certains idiomes linguistiques comme comportements indéfinis ou définis par la mise en œuvre?
Le premier facteur majeur est: y a-t-il deux implémentations existantes de la langue sur le marché qui sont en désaccord sur le comportement d'un programme particulier? ...
Le prochain facteur majeur est: la fonctionnalité présente-t-elle naturellement de nombreuses possibilités de mise en œuvre, dont certaines sont clairement meilleures que d'autres? ...
Un troisième facteur est le suivant: la caractéristique est-elle si complexe qu'une ventilation détaillée de son comportement exact serait difficile ou coûteuse à spécifier? ...
Un quatrième facteur est: la fonctionnalité impose-t-elle une charge élevée au compilateur à analyser? ...
Un cinquième facteur est le suivant: la fonctionnalité impose-t-elle une charge élevée à l'environnement d'exécution? ...
Un sixième facteur est: la définition du comportement empêche-t-elle une optimisation majeure? ...
Ce ne sont là que quelques facteurs qui me viennent à l'esprit; il y a bien sûr de nombreux autres facteurs dont les comités de conception linguistique débattent avant de faire une caractéristique «mise en œuvre définie» ou «non définie».
Ci-dessus est seulement une couverture très brève; l'article complet contient des explications et des exemples pour les points mentionnés dans cet extrait; cela vaut la peine d' être lu. Par exemple, les détails fournis pour le "sixième facteur" peuvent donner un aperçu de la motivation de nombreuses instructions dans le modèle de mémoire Java ( JSR 133 ), aidant à comprendre pourquoi certaines optimisations sont autorisées, conduisant à un comportement indéfini tandis que d'autres sont interdites, conduisant à limitations telles que les conditions de survenance et de causalité .
Aucun des matériaux de l'article n'est particulièrement nouveau pour moi, mais je serai damné si jamais je le voyais présenté d'une manière aussi élégante, concise et compréhensible. Incroyable.