首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程安全HashTable

线程安全HashTable
EN

Stack Overflow用户
提问于 2013-03-31 13:00:45
回答 3查看 5.2K关注 0票数 0

我有一个包含HashTable字段的类。我需要如何实现getset方法,以便对HashTable进行独占写入,而非排他性阅读?

代码语言:javascript
复制
private Hashtable _data = new Hashtable();

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

我需要我自己实现getter和setter。没有任何额外的框架帮手(我在面试中提出了这个问题)。

EN

回答 3

Stack Overflow用户

发布于 2013-03-31 13:25:56

首先解释一下,您不会使用Hashtable,而是使用.NET 4中的一个新并发集合,比如在内部处理所有同步的ConcurrentDictionary。

但是,如果您仍然想要滚动您自己的同步设置器,只需向类中添加一个对象并锁定它。

代码语言:javascript
复制
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对象,所以这也是可行的:

代码语言:javascript
复制
private Hashtable _data = new Hashtable();

public object this[object key]
{
    get 
    {
        return _data[key];
    }
    set 
    {
        lock(_data.SyncRoot) _data[key] = value;
    } 
}
票数 1
EN

Stack Overflow用户

发布于 2013-03-31 15:07:27

假设允许锁定和等待锁,那么下面的逻辑应该可以工作(注意,它使用了Java的语义。我不知道它是否适用于c#):

代码语言:javascript
复制
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();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-03-31 13:30:10

如下所示:

代码语言:javascript
复制
get 
{
    return _data[key];
}
set 
{
    lock(_data)
    {
      _data[key] = value;
    }
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15729614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档