Возможно, вы недоумеваете: почему на локальные переменные накладываются такие ограничения? Во-первых, существует ключевое различие во внутренней реализации переменных экземпляра класса и локальных переменных. Переменные экземпляра класса (объекта) хранятся в куче, в то время как локальные переменные располагаются в стеке. Если бы лямбда могла обратиться к локальной переменной напрямую, причем использовалась в отдельном потоке выполнения, то этот поток мог бы попытаться обратиться к данной переменной после того, как поток, выделивший под нее память, освободит ресурсы. Поэтому доступ к свободной локальной переменной в Java реализован в виде доступа к ее копии, а не к исходной переменной. Если присвоение значения переменной выполняется лишь однократно, то никакой разницы нет — отсюда и возникает вышеописанное ограничение.
Во-вторых, это ограничение также препятствует реализации типичных паттернов императивного программирования (которые, как мы поясним в дальнейших главах, затрудняют распараллеливание), связанных с изменением значения внешней переменной.