Там может быть большая разница.Самое большое различие между ними состоит в том, что в первом примере для блокировки используется один объект (отсюда и ключевое слово static
), а во втором примере ключевое слово this
подразумевает блокировку экземпляра.Следовательно, с точки зрения производительности и даже с точки зрения корректности может быть большая разница, но это зависит от кода внутри блокировки.
Когда все, что вам нужно, - это синхронизировать доступ к полям уровня экземпляра, вы не должныиспользуйте ключевое слово static
, поскольку оно будет синхронизировать сам код, а не данные (что может привести к ненужному снижению производительности).Конечно, если сами данные являются статическими (данные уровня класса вместо данных уровня экземпляра), вам нужно использовать ключевое слово static
.С другой стороны, когда вы используете ключевое слово this
для блокировки, когда вы получаете доступ к общим / статическим ресурсам, у вас (конечно) будет проблема с корректностью, поскольку синхронизация происходит на основе экземпляра, а несколько экземпляров по-прежнему будутвозможность доступа к общим данным одновременно.
И есть еще одна проблема, но разница намного меньше, чем для ранее отмеченных отличий.В первом примере для блокировки используется закрытый объект, а во втором - указатель this
, который является ссылкой на объект самого метода этого экземпляра.Поскольку эта ссылка общедоступна для других объектов, они могут заблокировать ее, что в редких случаях может привести к взаимоблокировке.Если вы разработчик приложений, я бы не стал сильно беспокоиться об этом (если вы не пользуетесь такими вещами, как System.String
или System.Type
), но если вы являетесь разработчиком фреймворка, вам определенно не следуетиспользуйте lock(this)
, поскольку невозможно определить, каким образом разработчики приложений будут (ab) использовать ваш код.