相关疑难解决方法(0)

将字符串用作锁定对象是否可以?

我需要在一组有限的字符串的基础上在一个区域中创建一个临界区.我希望为同一个字符串实例共享锁(有点类似于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)

.net c# multithreading locking .net-4.0

42
推荐指数
3
解决办法
1万
查看次数

使用string作为锁来进行线程同步

当我查看一些遗留应用程序代码时,我注意到它正在使用字符串对象来进行线程同步.我正在尝试解决此程序中的一些线程争用问题,并想知道这是否会导致如此奇怪的情况.有什么想法吗 ?

private static string mutex= "ABC";

internal static void Foo(Rpc rpc)
{
    lock (mutex)
    {
        //do something
    }
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading synchronization mutex

22
推荐指数
2
解决办法
2万
查看次数

标签 统计

c# ×2

multithreading ×2

.net ×1

.net-4.0 ×1

locking ×1

mutex ×1

synchronization ×1