I've been reading the openzeppelin document about upgradable contracts: https://docs.openzeppelin.com/contracts/4.x/upgradeable.
It mentioned:
each __{ContractName}_init function embeds the linearized calls to all parent initializers. As a consequence, calling two of these init functions can potentially initialize the same contract twice.
I don't quite understand why this can lead to initialize the same contract twice with the protection of initializer modifier. Is it because the parent initialize function may receive two parallel call from child contract?
And why by defining an additional function __{ContractName}_init_unchained
can mitigate this issue?
Appreciate any explanation, thanks!