锁定对象的最佳方法

best way to lock an object

我正在用 C# 构建一个程序,其中有 2 个线程使用相同的对象。 第一个线程更新对象值,第二个线程将其打印到 GUI。

我正在寻找最correctclean 的方法来实现线程之间的锁定机制。

我在我的程序(不是实际程序)中的实现示例:

namespace Test___Console
{
    public class Custom
    {
        public static object lockinObject = new object();
        public string name;
        public int value;
        public Custom(string name)
        {
            this.name = name;
        }
    }
    public class Program
    {
        public static object lockinObject = new object();
        static Thread firstThread;
        static Thread secondThread;
        static public Custom someData;
        static void Main(string[] args)
        {
            someData = new Custom("first");
            firstThread = new Thread(FirstThreadFunctions);
            secondThread = new Thread(SecondThreadFunctions);
            firstThread.Start();
            secondThread.Start();
            do
            {

        } while (true);
    }
    static void FirstThreadFunctions()
    {
        Random rnd = new Random();
        do
        {
            someData.value = rnd.Next();
            Thread.Sleep(1000);
        } while (true);
    }
    static void SecondThreadFunctions()
    {
        do
        {
            Console.WriteLine(someData.value.ToString());
            Thread.Sleep(1000);
        } while (true);
    }
}
}

我想到了3种方法来锁定someData对象

1.add 将锁定对象设置为 someData 对象。

2.add 将锁定对象设置为自定义 Class 变量。

3.encapsulate 所有使用相同数据对象的代码段都带有锁定语句(我最不喜欢的方法)。

我没有太多的编程经验所以我问你"correct"或"cleanest"处理这个问题的方法是什么

谢谢

您想尽可能地限制您的阻塞代码。以你的情况为例。

实际上,您要做的是锁定一个对象并防止它在写入时读取。阅读其他读者时无需锁定。

ReaderWriterLockslim 结果。然后在你的 Custom class

public class Custom
{
    private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();

    private int currvalue;
    public int value {
        get {
            cacheLock.EnterReadLock();
            var retValue = currvalue;
            cacheLock.ExitReadLock();
            return retValue;
        }
        set {
            cacheLock.EnterWriteLock();
            this.currvalue = value;
            cacheLock.ExitWriteLock();
        }
    } 
}

这样一来,您就可以将并发性限制在需要线程安全的当前对象上,锁被非常紧密地应用到数据上,这样就不会轻易引入死锁,并且只用于写入操作。