文字列の有限集合に基づいて、領域内にクリティカル セクションを作成する必要があります。同じ文字列インスタンスに対してロックを共有する必要があります ( String.Internアプローチに多少似ています)。
以下の実装を検討しています。
public class Foo
{
private readonly string _s;
private static readonly HashSet<string> _locks = new HashSet<string>();
public Foo(string s)
{
_s = s;
_locks.Add(s);
}
public void LockMethod()
{
lock(_locks.Single(l => l == _s))
{
...
}
}
}
このアプローチに問題はありますか? この方法で文字列オブジェクトをロックしても問題ありませHashSet<string>
んか?
たとえば、Dictionary<string, object>
文字列インスタンスごとに新しいロック オブジェクトを作成する を作成した方がよいでしょうか?
最終的な実装
提案に基づいて、次の実装を行いました。
public class Foo
{
private readonly string _s;
private static readonly ConcurrentDictionary<string, object> _locks = new ConcurrentDictionary<string, object>();
public Foo(string s)
{
_s = s;
}
public void LockMethod()
{
lock(_locks.GetOrAdd(_s, _ => new object()))
{
...
}
}
}