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 对象变量来保护所有实例所共有的数据。

lock(this) 锁定 当前实例对象,如果有多个类实例的话,lock锁定的只是当前类实例,对其它类实例无影响。所有不推荐使用。 
lock(typeof(Model))锁定的是model类的所有实例。 
lock(obj)锁定的对象是全局的私有化静态变量。外部无法对该变量进行访问。 
lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。 
所以,lock的结果好不好,还是关键看锁的谁,如果外边能对这个谁进行修改,lock就失去了作用。所以一般情况下,使用私有的、静态的并且是只读的对象。
posted on 2019-10-30 10:33  红磨坊后的白桦树  阅读(153)  评论(0编辑  收藏  举报