我有一个包含HashTable字段的类。我需要如何实现get和set方法,以便对HashTable进行独占写入,而非排他性阅读?
private Hashtable _data = new Hashtable();
public object this[object key]
{
get {} // must be non-exclusive
set {} // must be exclusive
}我需要我自己实现getter和setter。没有任何额外的框架帮手(我在面试中提出了这个问题)。
发布于 2013-03-31 13:25:56
首先解释一下,您不会使用Hashtable,而是使用.NET 4中的一个新并发集合,比如在内部处理所有同步的ConcurrentDictionary。
但是,如果您仍然想要滚动您自己的同步设置器,只需向类中添加一个对象并锁定它。
private readonly object _syncRoot = new object();
private Hashtable _data = new Hashtable();
public object this[object key]
{
get
{
return _data[key];
}
set
{
lock(_syncRoot) _data[key] = value;
}
}另外,我忘记了在哈希表中包含了一个SyncRoot对象,所以这也是可行的:
private Hashtable _data = new Hashtable();
public object this[object key]
{
get
{
return _data[key];
}
set
{
lock(_data.SyncRoot) _data[key] = value;
}
}发布于 2013-03-31 15:07:27
假设允许锁定和等待锁,那么下面的逻辑应该可以工作(注意,它使用了Java的语义。我不知道它是否适用于c#):
Object lock
bool write = false
int reads = 0
write(..) {
synch(lock) {
while (write || reads > 0)
lock.wait();
write = true;
}
...
synch(lock) {
write = false;
lock.notifyAll();
}
}
read() {
synch(lock) {
while (write)
lock.wait();
reads ++;
}
...
synch(lock) {
if (--reads == 0)
lock.notifyAll();
}
}发布于 2013-03-31 13:30:10
如下所示:
get
{
return _data[key];
}
set
{
lock(_data)
{
_data[key] = value;
}
} https://stackoverflow.com/questions/15729614
复制相似问题