Tôi có các tình huống sau:Cải thiện vấn đề khóa cần
Tôi đang cố gắng để khóa một sợi tại chỗ, nếu đó là chủ đề 'tùy chỉnh' id phù hợp với một trong đó đã bước vào phần khóa tắt mã, nhưng không nếu id khác.
Tôi tạo ra một số mẫu mã để giải thích hành vi của tôi muốn
class A
{
private static Dictionary<int, object> _idLocks = new Dictionary<int, object>();
private static readonly object _DictionaryLock = new object();
private int _id;
private void A (int id)
{
_id = id;
}
private object getObject()
{
lock (_DictionaryLock)
{
if (!_idLocks.ContainsKey(_id))
_idLocks.Add(_id, new object());
}
lock (_idLocks[_id])
{
if (TestObject.Exists(_id))
return TestObject(_id);
else
return CreateTestObject(_id);
}
}
}
Bây giờ công trình này 100% cho những gì tôi mở rộng, nơi id ví dụ 1 không kiểm tra để xem nếu đối tượng của nó đã được tạo ra trong khi người khác thread với id 1 đã bận rộn tạo đối tượng đó.
Nhưng có hai khóa và từ điển tĩnh dường như không đúng cách, vì vậy tôi hy vọng một người nào đó có thể chỉ cho tôi phương pháp ngăn chặn chuỗi truy cập chỉ khi chuỗi đó được tạo bằng cùng một id như id đã bận rộn thực thi mã trong phần bị khóa.
Tôi đã nhìn vào lớp ReaderWriterLockSlim nhưng với tôi nó không thực sự có ý nghĩa để được sử dụng vì tôi không muốn đối tượng TestObject (id) được đọc ở tất cả trong khi nó vẫn đang được tạo ra.
Tôi không quan tâm đến việc khóa chuỗi khi truy cập từ điển. Những gì tôi đang cố gắng tránh ở tất cả các chi phí là _id mà thread chạy không nên được sử dụng bên trong CreateTestObject(_id)
trong khi đã có một bận rộn, bởi vì các tập tin đang được tạo và xóa với id đó sẽ ném ngoại lệ nếu hai chủ đề đang cố gắng để truy cập vào cùng một tệp
Chỉ có thể sửa được bằng khóa bình thường, nhưng trong trường hợp này, tôi vẫn muốn một chuỗi có _id hiện không chạy bên trong phương thức CreateTestObject(_id)
để có thể nhập mã trong khóa.
Điều này là tất cả bởi vì những gì xảy ra bên trong CreateTestObject cần thời gian và hiệu suất sẽ bị ảnh hưởng nếu chuỗi đang chờ truy cập.
Có thể thực hiện khóa trên toàn bộ từ điển '_idLocks' thay vì có 2 khóa không? Tôi khá mới để khóa vì vậy tôi không chắc chắn những gì bạn có thể sử dụng như một đối tượng khóa hay không. –