https://www.cnblogs.com/lanxiaoke/p/11349148.html
lock测试代码
private static object locker = new object(); public static int money = 0; static void Main(string[] args) { Thread t1 = new Thread(Write); Thread t2 = new Thread(Write); t1.Start(); t2.Start(); Console.ReadKey(); } private static void Write() { while (true) { lock (locker) { money += 100; Console.WriteLine("有人正在操作请等候。。。。"); Thread.Sleep(3000); Console.WriteLine($"目前募集:{money}"); } } }
使用lock存在的问题
lock (this) 问题、lock (typeof (MyType)) 问题、 lock(“myLock”)
1.lock(this)的缺点就是在一个线程锁定某对象之后导致整个对象无法被其他线程访问。
2.锁定的不仅仅是lock段里的代码,锁本身也是线程安全的。
3.我们应该使用不影响其他操作的私有对象作为locker。
4.在使用lock的时候,被lock的对象(locker)一定要是引用类型的,如果是值类型,将导致每次lock的时候都会将该对象装箱为一个新的引用对象(事实上如果使用值类型,c#编译器在编译时会给出个错误)
通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:
如果实例可以被公共访问,将出现 lock (this) 问题。
如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。
由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock(“myLock”) 问题。
最佳做法是定义 private 对象来锁定, 或 private shared 对象变量来保护所有实例所共有的数据。