0

我有一个包含一个HashTable字段的类。我需要如何实现独占写入但非独占读取的方法get和方法?setHashTable

private Hashtable _data = new Hashtable();

public object this[object key]
{
    get {} // must be non-exclusive 
    set {} // must be exclusive
}

我需要自己实现 getter 和 setter。没有任何额外的框架助手(我在面试时问过这个问题)。

4

3 回答 3

1

假设允许锁定和等待锁定,那么以下逻辑应该起作用(注意它使用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-31T15:07:27.320 回答
1

首先说明您不会使用 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;
    } 
}

另外,我忘记了微软在 Hashtable 中包含了一个 SyncRoot 对象,所以这也可以:

private Hashtable _data = new Hashtable();

public object this[object key]
{
    get 
    {
        return _data[key];
    }
    set 
    {
        lock(_data.SyncRoot) _data[key] = value;
    } 
}
于 2013-03-31T13:25:56.757 回答
0

就像下面这样:

get 
{
    return _data[key];
}
set 
{
    lock(_data)
    {
      _data[key] = value;
    }
} 
于 2013-03-31T13:30:10.470 回答