Прежде всего, я бы сказал этот код может имитировать тупик, не гарантируется, что он всегда будет в тупике.
Что происходит в приведенном выше коде. У нас есть только один поток в пуле потоков. И как только мы вызываем множественную функцию, так как это будущее, поэтому она должна запускаться в отдельном потоке, скажем, мы назначаем для этой функции единственный поток, который у нас есть в пуле потоков.
Теперь функция addOne также является будущим, поэтому она снова начнет работать в том же потоке, но не будет ждать завершения a = addOne и перехода к следующей строке b = addOne, следовательно, тот же поток, который выполнял a = addOne теперь выполнение b = addOne и значение all никогда не будет вычислено, и это будущее не будет полным и никогда не будет завершено, так как у нас есть только один поток, тот же случай со строкой b = addOne, которую он контролирует, не будет ждать завершения этого Будущее и переход к циклу for также является асинхронным в Scala, поэтому он снова не будет оцениваться и будет ожидать последней строки и будет ждать бесконечное количество времени для завершения предыдущего фьючерса.
Необходимое и достаточное условие, чтобы попасть в мертвый замок.
- Условие взаимного исключения
- Состояние удержания и ожидания
- Не выгрузка
- Круговое ожидание
Здесь мы видим, что у нас есть только один поток, поэтому процессы, которые будут выполняться, не являются взаимоисключающими.
как только поток выполняет определенный блок и, следовательно, это будущее, и он не ожидает его завершения, он продолжает и выполняет следующий блок, следовательно, он достигает оператора await, и поток удерживается там, пока все другие будущие не завершено, ожидаем, что поток завершит будущее.
Как только поток выделен для ожидания, он не может быть выгружен, поэтому мы не можем выполнить оставшееся будущее, которое не завершено.
И существует циклическое ожидание, потому что ждет ждет, пока не завершится не завершенное будущее, а другие фьючерсы ждут завершения ожидания.
Просто мы можем сказать, что элемент управления напрямую дойдет до оператора await и начнет ждать завершения незавершенного будущего, которое в любом случае не произойдет. Потому что у нас есть только один поток в нашем пуле потоков.