Я предполагаю, что long не может быть изменчивым в C #, потому что они больше, чем 32-битные и не могут быть доступны в атомарной операции. Даже если они не будут храниться в регистре или кэше ЦП, поскольку для чтения или записи значения требуется более одной операции, один поток может прочитать значение, в то время как другая находится в процессе его записи.
Я полагаю, что есть разница между тем, как Java реализует изменчивые поля, и тем, как DotNet делает, но я не уверен в деталях. Java может использовать блокировку на поле, чтобы предотвратить проблему, которая есть в C #.