Ваш первый случай будет работать гарантированно.Второй случай, однако, может сломаться.Вы сравниваете, а затем запрашиваете блокировку, в то время как другой поток уже изменяет bestShapsity, и вы не знаете, что это делает сравнение недействительным.
Если вы хотите избежать блокировки до последней минуты, вы можете выполнить сравнение дважды,То есть сравнивать, получать блокировку, сравнивать снова и, только если она все еще действительна, увеличивать значение.Будьте осторожны с локальным кэшем значения, с которым вы сравниваете.Если вы хотите сделать это, вам нужна какая-то синхронизация, например MemoryBarrier.Все это может быть довольно сложным, поэтому я рекомендую просто заблокировать все это, если только вы не заметите, что производительность действительно является узким местом