我理解来自MSDN的锁定关键字的主要功能
lock语句(C#参考)
lock关键字通过获取给定对象的互斥锁,执行语句,然后释放锁来将语句块标记为关键部分.
什么时候应该使用锁?
例如,它对多线程应用程序有意义,因为它可以保护数据.但是,当应用程序没有关闭任何其他线程时,它是否有必要?
使用锁存在性能问题吗?
我刚刚继承了一个在任何地方使用锁的应用程序,它是单线程的,我想知道我应该留下它们,它们甚至是必要的吗?
请注意,这更多是一般知识问题,应用程序速度很好,我想知道这是否是将来要遵循的良好设计模式,或者除非绝对需要,否则应该避免这种情况.
问题如何确保我的应用程序是线程安全的?他们的任何常见做法,测试方法,要避免的事情,要寻找的东西是什么?
背景我目前正在开发一个服务器应用程序,它在不同的线程中执行许多后台任务,并使用Indy与客户端进行通信(使用另一组自动生成的线程进行通信).由于应用程序应该是高度可用的,程序崩溃是一件非常糟糕的事情,我想确保应用程序是线程安全的.无论如何,我不时发现一段代码抛出一个以前从未发生过的异常,在大多数情况下我发现它是某种同步错误,我忘了正确地同步我的对象.因此,我的问题涉及最佳实践,线程安全测试和类似的事情.
mghie:谢谢你的回答!我或许应该更准确一点.为了清楚起见,我了解多线程的原理,我在整个程序中使用同步(监视器),我知道如何将线程问题与其他实现问题区分开来.但尽管如此,我仍然忘记不时添加适当的同步.举个例子,我在代码中使用了RTL排序功能.看起来像
FKeyList.Sort (CompareKeysFunc);
Run Code Online (Sandbox Code Playgroud)
事实证明,我必须在排序时同步FKeyList.在最初编写那么简单的代码行时,我才想起它.这是我想谈的这些问题.一个人容易忘记添加同步代码的地方有哪些?您如何确保在所有重要位置添加同步代码?
在我写的应用程序中,我需要编写许多基类型,这很可能是不可变的.但我想知道可变类型在并行应用程序中如何与不可变类型进行比较.
你可以使用带有可变对象的锁,对吧?它与并行应用程序中不可变类型使用的其他技术相比如何?
你至少不使用具有不可变类型的锁,对吧?