我正在阅读有关线程和锁定的内容.通常的做法是你不能(不应该)锁定值类型.
所以问题是,锁定值类型的推荐方法是什么?我知道有几种方法可以做一件事,但我还没有看到一个例子.虽然在MSDN论坛上有一个很好的主题,但我现在似乎无法找到它.
谢谢
我有时会看到人们锁定局部变量.
这段代码坏了吗?
public void Do()
{
object o = new Object();
lock (o)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我认为object o = new Object();应该在方法之外作为一个Field.
由于每个线程都获得了一个新实例o,因此会有多个锁.
我在这里错过了什么?在这种特定情况下,它不应该锁定字段吗?
假设我有这段代码:
object o1 = new Object();
object o2 = o1;
Run Code Online (Sandbox Code Playgroud)
获取o1锁定与获取o2上的锁定相同?(如果o1被锁定,将锁定o2阻塞直到o1被释放?)
我有两个线程:一个提供更新,另一个将它们写入磁盘.只有最新的更新很重要,所以我不需要PC队列.
简而言之:
我目前正在使用专用锁对象来确保没有不一致,我想知道直接锁定标志和缓冲区有什么区别.我唯一知道的是,一个专用的锁对象需要信任,每个想要操纵标志和缓冲区的人都使用锁.
相关代码:
private object cacheStateLock = new object();
string textboxContents;
bool hasNewContents;
private void MainTextbox_TextChanged(object sender, TextChangedEventArgs e)
{
lock (cacheStateLock)
{
textboxContents = MainTextbox.Text;
hasNewContents = true;
}
}
private void WriteCache() // running continually in a thread
{
string toWrite;
while (true)
{
lock (cacheStateLock)
{
if (!hasNewContents)
continue;
toWrite = textboxContents;
hasNewContents = false;
}
File.WriteAllText(cacheFilePath, toWrite);
}
}
Run Code Online (Sandbox Code Playgroud)