.net - заблокировать коробочное значение вместо нового объекта - PullRequest
4 голосов
/ 22 ноября 2011

Я недавно наткнулся на этот код в одном из проектов, над которым я работаю, и я не уверен, как он должен себя вести.

private static object _syncRoot = 1;

public void DoSomething()
{
    lock (_syncRoot)
    {
        // do stuff...
    }
}

Я знаю, что это обычно используется new object() для вашего замка.Как будет вести себя эта блокировка при блокировке целого числа в штучной упаковке?Что произойдет, если вы добавите еще одну блокировку с тем же значением?

private static object _anotherLock = 1;

public void DoSomethingElse()
{
    lock (_anotherLock)
    {
        // do stuff...
    }
}

Ответы [ 4 ]

3 голосов
/ 22 ноября 2011

lock всегда использует эталонное равенство.

Два разных штучных символа 1 дают две разные блокировки.

2 голосов
/ 22 ноября 2011

Хотя это и не имеет прямого отношения к боксу, оно может сломаться, если вместо int использовать строку типа «1». Две строки с одинаковым постоянным значением могут иметь одну и ту же ссылку, поэтому для блокировки «отдельных» строк будет использоваться один и тот же блок синхронизации. В общем, я бы рекомендовал new object () [известный хороший шаблон] над константой, подобной этой.

На самом деле, я не уверен, что бокс в уникальных экземплярах на самом деле в спецификации. Конечно, я мог бы видеть создание «пула бокса» для общих констант (например, 0 или 1) как потенциальное улучшение CLR. Если бы это было реализовано, такое использование было бы неудачным (скорее всего, довольно неприятным и непредсказуемым образом).

1 голос
/ 22 ноября 2011

Второе значение будет помещено в другой объект.Блокировки будут полностью независимы друг от друга, потому что они ссылаются на два разных объекта.

0 голосов
/ 22 ноября 2011

Это не заблокирует 1, это не может сделать, так что вкратце объекты в штучной упаковке будут отличаться, и эти блокировки будут отличаться.

Есть причина, по которой ValueTypes нельзя заблокировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...