问题:避免使用lock(this)或lock(string),因为无法保证你提供的方法,在外部类中使用的时候,开发人员会不会锁定当前对象。
解决方法:最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。最好使用私有的静态只读的锁对象,保证不会影响其他逻辑的正常执行。
private static readonly object obj = new object();
lock(obj){
//操作
}
延伸:
lock(this) 锁定当前实例对象,如果有多个类实例的话,lock锁定只是锁定当前类实例,对其他类实例无影响
lock(typeof(Model))锁定的是model类的所有实例
lock(obj)锁定的对象是全局的私有化静态变量。外部无法对该变量进行访问
lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则他将一直等待(即被阻止),直到该对象被释放。
所有lock的结果好不好还是要看锁的是谁,如果外摆你能对这个锁住的对象进行修改则lock就失去了作用没有意义。一般情况下使用私有的静态、只读的对象。
注:锁住的必须是引用类型的对象,string类型除外。锁定字符串非常危险,因为字符串被公共语言运行库 (CLR)“暂留”。 这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。而且lock(this)只对当前对象有效,如果多个对象之间就达不到同步的效果。lock(typeof(Class))与锁定字符串一样,范围太广了。