C#线程行为

标签 c# multithreading

谁能解释一下为什么会这样:

    Object ready_lock = new Object();
    Object thread_lock = new Object();
    public static bool able_to_get_lock = false;

    public void GetThreadLock()
    {
        if (Monitor.TryEnter(thread_lock,2))
        {
            able_to_get_lock = true;
        }
    }

    [TestMethod]
    public void ThreadingModelTest()
    {
        Monitor.Enter(ready_lock);
        Thread t1 = new Thread(new ThreadStart(GetThreadLock));
        t1.Start();
        Thread.Sleep(400);
        Assert.IsTrue(able_to_get_lock);

    }

但是如果我将锁定对象的对象类型更改为字符串(如下所示),它会失败:

    String ready_lock = "Hello";
    String thread_lock = "Hello";

这让我困惑了一段时间。谢谢 :)

最佳答案

当您将它们都设置为“Hello”时,由于字符串驻留,您最终会得到具有相同值的两个变量。就像在做

Object ready_lock = new Object();
Object thread_lock = ready_lock;

所以基本上这是一种情况“如果你有两个锁,它们可以被不同的线程独立锁定,但是只有一个锁,一次只有一个线程可以获得锁。”

关于C#线程行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3449451/

相关文章:

c# - 使用 ZedGraph lib 在图形上隐藏 X 轴

java - thread.sleep(5000) 不起作用

c++ - SQLite——C++多线程读写

multithreading - 在汇编语言级别如何实现线程同步?

c# - 使用 Entity Framework 绑定(bind)自定义属性

C# - 列表框不显示项目

c# - NancyFx 绑​​定 TimeSpan 不工作 json

c# - CollectionView 实时排序回调

javascript - 是否将Node.js视为具有工作线程的多线程?

python - 在 Flask Python 中产生一个单独的执行线程(即向开发人员发送日志电子邮件)?