Дают ли эти два ключевых слова абсолютно одинаковый эффект, или я должен знать о них что-то?
По данным этого сайта: http://en.csharp -online.net / CSharp_FAQ: _What_is_the_difference_between_CSharp_lock_and_Java_synchronized , блоки кода C # lock и Java synchronized "семантически идентичны", в то время как для методов Java использует synchronized в то время как C # использует атрибут: [MethodImpl(MethodImplOptions.Synchronized)].
lock
synchronized
[MethodImpl(MethodImplOptions.Synchronized)]
Одно интересное отличие, которое не отражено в ссылке, опубликованной Keeg: насколько я знаю, в Java нет эквивалента метода вызовов для Monitor.Enter и * .NET. 1005 * Monitor.Exit , к которому сводится оператор C # lock. Это означает, что вы также не можете сделать эквивалент Monitor.TryEnter - хотя, конечно, пакет java.util.concurrent.locks (начиная с 1.5) имеет множество блокировок, которые имеют больше доступных функций.
Я Java, вам не нужно беспокоиться о блокировке открытых типов, которыми вы владеете.
В .NET вы должны
Обновлено: это для типов, которыми вы владеете. Блокировка для общедоступных типов, которыми вы не владеете, плоха на любом языке:)