Tôi đang cố khóa một đối tượng "đóng hộp" trong ứng dụng C#, điều này là không thể?C# luồng - Khóa đối tượng
class t
{
System.Object t_x = new object();
public t(int p)
{
t_x = p;
}
public void w()
{
lock (t_x)
{
for (int i = 0; i < 4; i++)
{
{
t_x = ((int)t_x) + 1;
Console.WriteLine(t_x);
Thread.Sleep(1000);
}
}
}
}
}
Trong lớp khác tôi có thể bắt đầu 2 chủ đề:
Thread b1 = new Thread(new ThreadStart(t1.w));
b1.Start();
Thread b2 = new Thread(new ThreadStart(t1.w));
b2.Start();
Tuy nhiên phần không bị khóa. Khi tôi khóa một đối tượng tùy ý (tức là một đối tượng được tạo và không được sửa đổi làm đối tượng a = new object()) nó khóa tốt. Hoạt động đấm bốc có bằng cách nào đó "làm suy yếu" đối tượng của tôi không ??
Tại sao bạn sẽ phân công lại đối tượng khóa trong một khối khóa? Điều đó đánh bại mục đích - vì toàn bộ quan điểm đồng bộ hóa là để tránh các chủ đề khác nhau chà đạp lẫn nhau cho một tài nguyên "được chia sẻ". – Gishu
Tôi nghĩ rằng câu trả lời được chấp nhận nó không phải là tốt –
Dường như có một sự lặp lại định kỳ trong số các nỗ lực ít kinh nghiệm. Net luồng rằng các tuyên bố khóa thực sự "khóa" hoặc bảo vệ các đối tượng mà khóa được gọi là. Họ dường như bỏ lỡ một thực tế rằng đối tượng thực sự là một chìa khóa cho một khối mã bị khóa, phần quan trọng. –