Я пытался заблокировать
переменную Boolean
, когда столкнулся со следующей ошибкой :
'bool' is not a reference type as required by the lock statement
Похоже, что в операторах lock
разрешены только ссылочные типы, но я не уверен, что понимаю почему.
Андреас в своем комментарии утверждает:
Когда объект [типа значения] передается от одного потока к другому, создается копия, поэтому потоки в итоге работают с двумя разными объектами, что безопасно.
Это правда? Значит ли это, что когда я делаю следующее, я фактически изменяю два разных x
в методе xToTrue
и xToFalse
?
public static class Program {
public static Boolean x = false;
[STAThread]
static void Main(string[] args) {
var t = new Thread(() => xToTrue());
t.Start();
// ...
xToFalse();
}
private static void xToTrue() {
Program.x = true;
}
private static void xToFalse() {
Program.x = false;
}
}
(этот код сам по себе явно бесполезен в своем состоянии, он только для примера)
P.S: Я знаю об этом вопросе на Как правильно заблокировать тип значения. Мой вопрос не связан с как, а связан с почему.