0

フィールドを含むクラスがありHashTableます。への排他的な書き込みと非排他的な読み取りのメソッドをどのように実装する必要がありgetますか?setHashTable

private Hashtable _data = new Hashtable();

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

ゲッターとセッターの独自の実装が必要です。追加のフレームワーク ヘルパーなし (インタビューでこの質問をしました)。

4

3 に答える 3

1

最初に、Hashtable を使用しないことを説明します。代わりに、すべての同期を内部で処理する ConcurrentDictionary など、.NET 4 の新しい同時実行コレクションの 1 つを使用します。

ただし、それでも独自の同期セッターをロールしたい場合は、クラスにオブジェクトを追加してロックするだけです。

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;
    } 
}

また、Microsoft が 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 に答える