多线程学习笔记(二)
上一节讲到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只通知等待态中的第一条线程。