Поскольку типы значений не имеют блока синхронизации, который оператор блокировки использует для блокировки объекта.Только ссылочные типы несут накладные расходы на информацию о типе, блок синхронизации и т. Д.
Если вы укажете свой ссылочный тип, то теперь у вас есть объект, содержащий тип значения, и вы можете заблокировать этот объект (я ожидаю), поскольку теперь онимеет дополнительные издержки, которые имеют объекты (указатель на блок синхронизации, который используется для блокировки, указатель на информацию о типе и т. д.).Как и все остальные, утверждая, что - если вы поместите объект в коробку, вы будете получать НОВЫЙ объект каждый раз, когда вы его упаковываете, так что вы будете каждый раз блокировать разные объекты - что полностью отрицает цель взятия блокировки.
Это, вероятно, сработает (хотя это совершенно бессмысленно, и я не пробовал)
int x = 7;
object boxed = (object)x;
//thread1:
lock (boxed){
...
}
//thread2:
lock(boxed){
...
}
Пока все используют в штучной упаковке, а объект в штучной упаковке устанавливается только тогда, когда вы, вероятно, получите правильную блокировку, так как вы блокируетена объект в штучной упаковке, и он создается только один раз.Не делайте этого, хотя ... это всего лишь упражнение на мысль (и может даже не сработать - как я уже говорил, я не проверял это).
Что касается вашего второго вопроса - Нет, значение нескопировать для каждого потока.Оба потока будут использовать одно и то же логическое значение, но не гарантируется, что потоки увидят самое свежее значение для него (когда один поток устанавливает значение, оно может не сразу записаться обратно в область памяти, поэтому любой другой поток, считывающий это значение, получит«старый» результат).