锁定对象的最佳方法
best way to lock an object
我正在用 C# 构建一个程序,其中有 2 个线程使用相同的对象。
第一个线程更新对象值,第二个线程将其打印到 GUI。
我正在寻找最correct
或 clean
的方法来实现线程之间的锁定机制。
我在我的程序(不是实际程序)中的实现示例:
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();
}
}
}
这样一来,您就可以将并发性限制在需要线程安全的当前对象上,锁被非常紧密地应用到数据上,这样就不会轻易引入死锁,并且只用于写入操作。
我正在用 C# 构建一个程序,其中有 2 个线程使用相同的对象。 第一个线程更新对象值,第二个线程将其打印到 GUI。
我正在寻找最correct
或 clean
的方法来实现线程之间的锁定机制。
我在我的程序(不是实际程序)中的实现示例:
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();
}
}
}
这样一来,您就可以将并发性限制在需要线程安全的当前对象上,锁被非常紧密地应用到数据上,这样就不会轻易引入死锁,并且只用于写入操作。