分區是我創建的一個小類。我有數以千計的分區駐留在命名爲Partitions的ConcurrentDictionary中。序列化之前,我想鎖定一個特定的分區,做一些工作然後解鎖分區。鎖定ConcurrentDictionary的值
在此期間沒有其他線程應該能夠訪問該分區。由於我的類Partition是一個引用類型,我想知道是否可以像下面的代碼中那樣鎖定一個單獨的Partition對象?
在下面的鎖定期間,這會阻止來自ConcurrentDictionary分區中單個分區的其他線程嗎?
我不想使用類級鎖定對象進行鎖定。我的思考過程是多個線程應該能夠同時運行下面的代碼。他們只是不應該能夠訪問特定的分區,如果它已被鎖定......
private void serializePartition(int partNo)
{
Partition p;
//Get a reference to the partition, lock, and save it to disk.
lock (p = Partitions[partNo])
{
using (var file = File.Create(dataPath + tableName + partNo + ".ppmi"))
{
Serializer.Serialize(file, p);
}
//decrement _CurrentRecordsInMemory by the size of the partition.
Interlocked.Add(ref _CurrentRecordsInMemory, p.Data.Count * -1);
//Clear the partitions data to free up memory and reset partition variables
p.Data = null;
p.OnDisk = true;
p.StartCount = 0;
}
}
另一個鎖,實際上阻止線程使用分區的那個鎖在哪裏? –
我想這就是我所要求的。由於分區是通過引用傳遞的,因此上面的鎖是否允許所有其他線程在serializePartition執行時訪問該分區? –
我是根據ConcurrentDictionary訪問線程安全,如果這是你問的。 –