lock
и synchronized
в целом одинаковы, хотя они реализованы несколько по-другому - в частности, в C # блокировка является просто синтаксическим сахаром для вызовов Monitor.Enter / Exit, тогда как в Java нет библиотечного эквивалента.
C # не имеет синхронизированных методов, хотя вы можете использовать [MethodImpl(MethodImplOptions.Synchronized)]
для достижения почти такого же эффекта. (Я думаю, что есть некоторые тонкие различия, но в целом они одинаковы.) Однако я бы не советовал использовать это на любом языке - вместо этого используйте закрытые блокировки.
Другая поддержка библиотек параллелизма в .NET и Java также отличается - примитивы Object.wait / notify / notifyAll и Monitor.Wait / Pulse / PulseAll похожи, но поддержка более высокого уровня довольно отличается.
Модели памяти немного отличаются - если вы не пытаетесь работать без блокировки, они достаточно близки, но правильный код без блокировки будет отличаться в .NET и Java.
Не совсем уверен, как ответить на точку вашего веб-приложения ...