多线程学习笔记(二)

        上一节讲到lock锁,还有一种锁就是monitor(监视器)

        区别

             lock锁对锁定的对象一直要等当前进程全部处理完才能让其他进程进入。

             monitor锁可以程序控制解锁,只是在进程进行某一部分运算时进行上锁,等运行结束时可以解锁供其他进程进行运算

             注:错误“从不同步的代码块中调用了对象同步方法”

                   原因一:monitor锁住的是值类型的变量,在monitor.Enter(int i)是对i进行了一次装箱的过程,而后在monitor.Exit(int i)中又进行了一次装箱,系统会认为两次的锁不是同一个

                  原因二:monitor在代码中已经释放,没有重新申请锁,而后又调用了monitor.Exit()的方法

                 摘自MSDN:使用 Monitor 锁定对象(即引用类型)而不是值类型。将值类型变量传递给 Enter 时,它被装箱为对象。如果再次将相同的变量传递给 Enter,则它被装箱为一个单独对象,而且线程不会阻止。Monitor 本应保护的代码未受保护。此外,将变量传递给 Exit 时,也创建了另一个单独对象。因为传递给 Exit 的对象和传递给 Enter 的对象不同,Monitor 将引发 SynchronizationLockException

               

                                                       

                              当一个线程创建完毕就处于就绪状态等待CPU调度,

                              Enter(),pause(),pauseall(),wait()三个方法

                              一个进程视图调用一个对象,尝试给其加上锁,发现无法加锁,会进入就绪状态  

                              Enter()是对一个对象进行加锁

                              Exit()是线程对这个对象解锁,但不会通知等待态中的线程进入就绪状态,如果就绪态中不存在线程则线程会发生死锁,因为他不会去调用pause方法将等待态中的线程进入就绪态

                              wait()是线程释放对象锁,并进入等待态,也不会通知等待态中的线程进入就绪态

                              pause和pauseall是通知等待态的线程进入就绪态,pause只通知等待态中的第一条线程。

        

                                           

posted @ 2010-11-17 14:48  菜鸟吃虫,虫吃菜  阅读(334)  评论(0编辑  收藏  举报