Javadoc of Executor interface говорит следующее:Случается-до гарантии Executor.submit()
памяти непротиворечивости эффекты: действия в потоке до подачи
Runnable
объекта вExecutor
произойдет, до начала его исполнения, может быть, другой поток.
Какая часть спецификации языка Java гарантирует это? Или это только потому, что в реализациях используется некоторая внутренняя синхронизация? (Например, было бы замечательно, если бы это было так.) Значит, при реализации пользовательского Executor
я должен знать об этом требовании?
Ну, javadoc указывает его. JLS не указывает API. Он определяет язык. И да, если вы должны были выполнить Исполнителя, вам лучше соответствовать спецификациям интерфейса Executor. –
Ну, в общем, язык гарантирует, что код, ограниченный потоком, выполняется последовательным образом. Невозможно было бы установить какие-либо действия - прежде чем отношения в противном случае в однопоточных приложениях. Поэтому приведенное выше утверждение не требует какой-либо спецификации по модели памяти (которая касается видимости и согласованности изменяемых данных между потоками). Вышеприведенное просто подкрепляет представление о том, что код, предшествующий представлению, будет выполнен до начала выполнения представления (даже если в другом потоке). – scottb
@scottb Я не согласен. Если, например, рабочий поток непрерывно опросил ArrayList для новой задачи, у вас не было бы никаких действий - до гарантии: рабочий поток мог видеть новый элемент в списке, но в несогласованном состоянии. Поэтому разработчик должен проявлять осторожность, чтобы обеспечить эту гарантию (синхронизация и т. Д.) –