我需要在一组有限的字符串的基础上在一个区域中创建一个临界区.我希望为同一个字符串实例共享锁(有点类似于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))
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法有什么问题吗?以这种方式锁定字符串对象是否可以,并且在使用时是否存在任何线程安全问题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 …Run Code Online (Sandbox Code Playgroud) 当我查看一些遗留应用程序代码时,我注意到它正在使用字符串对象来进行线程同步.我正在尝试解决此程序中的一些线程争用问题,并想知道这是否会导致如此奇怪的情况.有什么想法吗 ?
private static string mutex= "ABC";
internal static void Foo(Rpc rpc)
{
lock (mutex)
{
//do something
}
}
Run Code Online (Sandbox Code Playgroud)