lock锁速记

Posted pretty girl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lock锁速记相关的知识,希望对你有一定的参考价值。

1、Lock关键字主要实现锁互斥,确保一个线程A在请求此操作时不会被其线程B请求中断(假设A先请求并在没有未完成的操作情况下申请了此互斥锁)。lock的参数必须是基于引用类型的对象,不要是基本类型像bool,int什么的,这样根本不能同步,原因是lock的参数要求是对象,如果传入int,势必要发生装箱操作,这样每次lock的都将是一个新的不同的对象。最好避免使用public类型或不受程序控制的对象实例,因为这样很可能导致死锁。特别是不要使用字符串作为lock的参数,因为字符串被CLR“暂留”,就是说整个应用程序中给定的字符串都只有一个实例,因此更容易造成死锁现象。建议使用不被“暂留”的私有或受保护成员作为参数。

DEMO : lock(this)  
            { 
                Console.WriteLine("CurrentThread:"+Thread.CurrentThread.Name); 
                //如果没有lock关键字的保护,那么可能在执行完if的条件判断(成立)之后  
                //另外一个线程却执行了balance=balance-amount修改了balance的值 
                //而这个修改对这个线程是不可见的,所以可能导致这时if的条件已经不成立了 
                //但是,这个线程却继续执行 balance=balance-amount,所以导致balance可能小于0 
                if(balance>=amount) 
                { 
                    Thread.Sleep(5);
                    balance=balance-amount; 
                    return  amount; 
                }  else 
                { 
                    return 0;
                    //transactionrejected 
                } 
            }  

 

以上是关于lock锁速记的主要内容,如果未能解决你的问题,请参考以下文章

锁 Lock

Mysql 死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁Insert Intention Lock Auto-increment Lock Backup Lock Log Lock

锁 Lock重入锁写入锁

多线程18:Lock锁

Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock

并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)