В Java вы можете считать поведение некорректно синхронизированной программы неопределенным.
Java 7 JLS использует слово «undefined» один раз, в 17.4.8. Требования к исполнению и причинности :
Мы используем f|d
для обозначения функции, заданной ограничением области f
до d
. Для всех x
в d
, f|d(x) = f(x)
и для всех x
не в d
, f|d(x)
не определено ...
Документация по Java API описывает некоторые случаи, когда результаты не определены, например, в (устаревшем) конструкторе Date (int year, int month, int day) :
Результат не определен, если данный аргумент выходит за пределы ...
Javadocs для состояния ExecutorService.invokeAll (Collection) :
Результаты этого метода не определены, если данная коллекция была изменена во время выполнения этой операции ...
Менее формальный вид «неопределенного» поведения можно найти, например, в ConcurrentModificationException , где в документах API используется термин «лучшее усилие»:
Обратите внимание, что отказоустойчивое поведение не может быть гарантировано, так как, вообще говоря, невозможно сделать какие-либо жесткие гарантии при наличии несинхронизированной параллельной модификации. Fail-быстрые операции бросить ConcurrentModificationException
на максимальных усилий . Поэтому было бы неправильно писать программу, которая зависела от этого исключения для ее корректности ...
аппендикс
Один из комментариев к вопросу относится к статье Эрика Липперта, в которой содержится полезное введение в тему: поведение, определяемое реализацией .
Я рекомендую эту статью для независимой от языка аргументации, хотя стоит помнить, что автор нацелен на C #, а не на Java.
Традиционно мы говорим, что идиома языка программирования имеет неопределенное поведение если использование этой идиомы может иметь какой-либо эффект; он может работать так, как вы ожидаете, или он может стереть ваш жесткий диск или привести к поломке вашей машины. Более того, автор компилятора не обязан предупреждать вас о неопределенном поведении. (И действительно, есть некоторые языки, в которых программы, использующие идиомы «неопределенного поведения», разрешены спецификацией языка для сбоя компилятора!) ...
Напротив, идиома, которая имеет поведение, определяемое реализацией котором автор компилятора имеет несколько вариантов того, как реализовать функцию, и должен выбрать один. Как следует из названия, поведение, определяемое реализацией, по крайней мере, определено. Например, C # позволяет реализации генерировать исключение или создавать значение при переполнении целочисленного деления, но реализация должна выбрать его. Он не может стереть ваш жесткий диск ...
Каковы некоторые из факторов, которые побуждают комитет по проектированию языка оставлять определенные языковые идиомы неопределенными или определяемыми реализацией поведениями?
Первый важный фактор: существуют ли две существующие реализации языка на рынке, которые не согласны с поведением конкретной программы?...
Следующий важный фактор: предоставляет ли эта функция много разных возможностей для реализации, некоторые из которых явно лучше, чем другие?...
Третий фактор: настолько ли сложна эта особенность, что подробное описание ее точного поведения будет сложно или дорого определить? ...
Четвертый фактор: накладывает ли эта функция большую нагрузку на анализатор? ...
Пятый фактор: накладывает ли функция большую нагрузку на среду выполнения? ...
Шестой фактор: делает делает поведение определяется исключающие некоторые основные оптимизации? ...
Это всего лишь несколько факторов, которые приходят на ум; Есть, конечно, много, много других факторов, которые комитеты языкового дизайна обсуждают, прежде чем сделать функцию «определенной реализацией» или «неопределенной».
Выше только очень краткое освещение; полная статья содержит объяснения и примеры для пунктов, упомянутых в этом отрывке; это много чтения стоит. Например, подробности, приведенные для «шестого фактора», могут дать представление о мотивации для многих операторов в модели памяти Java ( JSR 133 ), помогая понять, почему некоторые оптимизации допускаются, что приводит к неопределенному поведению, в то время как другие запрещены, что приводит к ограничения, такие как « предвидеть» и требования причинности .
Ни один из материалов статьи не является для меня особенно новым, но будь я проклят, если я когда-либо видел, чтобы он был представлен таким элегантным, лаконичным и понятным способом. Удивительный.