Вам потребуется ключевое слово volatile или какой-либо другой механизм синхронизации для обеспечения соответствия отношения «произойдет до», которое гарантирует видимость переменной в потоках, отличных от потока, в котором она была написана. Без такой синхронизации все рассматривается как происходящее «одновременно», даже если это не время настенных часов.
В вашем конкретном примере одна вещь, которая может произойти без синхронизации, заключается в том, что значение, написанное потоком A, никогда не сбрасывается из кеша в основную память, а поток B выполняется на другом процессоре и никогда не видит значение, написанное потоком A.
Когда вы имеете дело с потоками, время настенных часов ничего не значит. Вы должны синхронизировать правильно, если вы хотите, чтобы данные проходили между потоками должным образом. Не существует ярлыка для правильной синхронизации, которая позже не вызовет головных болей.
В случае Вашего первоначального вопроса, некоторые способы надлежащей синхронизации может быть Достигнутые с помощью volatile
ключевого слова, с помощью synchronized
блоков, или при наличии потока, который читает значение переменной join()
потока, в котором переменная написана.
Edit: В ответ на ваш комментарий, Future
имеет внутреннюю синхронизацию, например, что вызов Get() на будущем учреждает «происходит до» отношений, когда вызов возвращается, так что и обеспечивает правильную синхронизацию.
https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq. html # volatile Стоит прочитать все. – pvg
, если поток B выполнил A.join(), тогда чтение переменной дает значение, записанное потоком A, и переменная не должна быть изменчивой. –
Как гарантировано, что поток A закончен, с точки зрения B? – hyde