Tôi đã viết một thử nghiệm về những gì tôi nghĩ rằng nên là một trường hợp hợp lệ cho một bế tắc. Nó xuất hiện rằng khi lock
đã được mua lại bởi một thể hiện của một lớp, trường hợp đó không cần phải mua lại lock
nữa ngay cả khi tôi rõ ràng cố gắng gọi một phương pháp khác nên lock
một lần nữa.Khóa aqcuired và tiếp tục nỗ lực để khóa không chặn: là C# khóa lại entrant?
Đây là lớp:
internal class Tester
{
private readonly object _sync = new object();
public Tester() { }
public void TestLock()
{
lock (_sync)
{
for (int i = 0; i < 10; i++)
{
Deadlock(i);
}
}
}
private void Deadlock(int i)
{
lock (_sync)
{
Trace.WriteLine(i + " no deadlock!");
}
}
}
Output:
0 không bế tắc!
1 không có bế tắc!
2 không có bế tắc!
3 không có bế tắc!
4 không có bế tắc!
5 không có bế tắc!
6 không có bế tắc!
7 không có bế tắc!
8 không bế tắc!
9 không có bế tắc!
Tôi đã nghĩ rằng điều này sẽ gây ra bế tắc ... ai có thể làm sáng tỏ điều này không?
Tôi khá thoải mái với đa luồng, nhưng tôi đoán tôi chỉ chưa bao giờ nhận ra ổ khóa C# được tái nhập. Cảm ơn câu trả lời ... – Kiril