Em Java, você pode considerar indefinido o comportamento do programa sincronizado incorretamente.
O Java 7 JLS usa a palavra "indefinido" uma vez, no 17.4.8. Execuções e requisitos de causalidade :
Usamos f|d
para denotar a função fornecida restringindo o domínio de f
para d
. Para todos x
em d
, f|d(x) = f(x)
e para todos que x
não estão d
, f|d(x)
é indefinido ...
A documentação da API Java especifica alguns casos em que os resultados são indefinidos - por exemplo, no construtor (descontinuado) Date (int year, int month, int day) :
O resultado é indefinido se um determinado argumento estiver fora dos limites ...
Javadocs para o estado ExecutorService.invokeAll (Collection) :
Os resultados deste método são indefinidos se a coleção fornecida for modificada enquanto esta operação estiver em andamento ...
Um tipo menos formal de comportamento "indefinido" pode ser encontrado, por exemplo, em ConcurrentModificationException , em que os documentos da API usam o termo "melhor esforço":
Observe que o comportamento à prova de falhas não pode ser garantido, pois, em geral, é impossível fazer garantias concretas na presença de modificação simultânea não sincronizada. As operações à prova de falhas são realizadas ConcurrentModificationException
com o melhor esforço . Portanto, seria errado escrever um programa que dependesse dessa exceção para sua correção ...
Apêndice
Um dos comentários da pergunta refere-se a um artigo de Eric Lippert, que fornece uma introdução útil aos tópicos: comportamento definido pela implementação .
Eu recomendo este artigo pelo raciocínio independente de idioma, embora valha a pena lembrar que o autor tem como alvo C #, não Java.
Tradicionalmente, dizemos que um idioma da linguagem de programação tem um comportamento indefinido se o uso desse idioma puder ter algum efeito; ele pode funcionar da maneira que você espera, ou pode apagar seu disco rígido ou travar sua máquina. Além disso, o autor do compilador não tem obrigação de avisá-lo sobre o comportamento indefinido. (E, de fato, há algumas linguagens nas quais os programas que usam expressões idiomáticas de "comportamento indefinido" são permitidos pela especificação da linguagem para travar o compilador!) ...
Por outro lado, um idioma que possui comportamento definido pela implementação é o comportamento em que o autor do compilador tem várias opções sobre como implementar o recurso e deve escolher um. Como o nome indica, o comportamento definido pela implementação é pelo menos definido. Por exemplo, o C # permite que uma implementação lance uma exceção ou produza um valor quando uma divisão inteira exceder o limite, mas a implementação deve escolher uma. Não pode apagar o seu disco rígido ...
Quais são alguns dos fatores que levam um comitê de design de idiomas a deixar certos idiomas como comportamentos indefinidos ou definidos pela implementação?
O primeiro fator importante é: existem duas implementações existentes da linguagem no mercado que discordam do comportamento de um programa específico? ...
O próximo fator importante é: o recurso apresenta naturalmente muitas possibilidades diferentes de implementação, algumas das quais são claramente melhores que outras? ...
Um terceiro fator é: o recurso é tão complexo que seria difícil ou caro especificar um detalhamento exato de seu comportamento? ...
Um quarto fator é: o recurso impõe um alto ônus ao compilador para analisar? ...
Um quinto fator é: o recurso impõe uma carga alta ao ambiente de tempo de execução? ...
Um sexto fator é: fazer o comportamento definido impede alguma otimização importante? ...
Esses são apenas alguns fatores que vêm à mente; é claro que existem muitos outros fatores que os comitês de design de idiomas debatem antes de tornar um recurso "implementação definida" ou "indefinida".
Acima é apenas uma cobertura muito breve; o artigo completo contém explicações e exemplos para os pontos mencionados neste trecho; é muito vale a pena ler. Por exemplo, detalhes fornecidos para o "sexto fator" podem fornecer uma visão da motivação de muitas instruções no Java Memory Model ( JSR 133 ), ajudando a entender por que algumas otimizações são permitidas, levando a um comportamento indefinido enquanto outras são proibidas, levando a limitações como acontecer antes e requisitos de causalidade .
Nenhum dos materiais do artigo é particularmente novo para mim, mas ficarei condenado se o tiver visto de uma maneira tão elegante, consistente e compreensível. Surpreendente.