做ios也有1年了,c#的东西有些都忘记了,最近几天也打算重温一下,不能学了ios把c#给抛弃了,两者都要抓,一精多专。目前c#只是重温,重点是web这块。今天主要是想起了之前做过的面试题,虽然题比较变态,但也有它的意义。
根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
想必做过c#面试过的都会遇到过这题,我记得我第一次面试做的时候也是做错了,想着递归中包含锁,肯定会死锁。
当时回去自己动手敲了一下,然并卵,没有死锁。后来又看了大学时的c#教材,又百度了下,发现自己把锁理解错了。我记得当时教材上举的例子是一个银行取款的例子。而在这道题中,一直都在主线程中,并没有开启第二个线程,怎么会发生锁呢。 我记得数据库中也有锁机制,锁主要是解决并发的问题,锁生成的原因主要有两个:同时争夺同一资源a、b同时要c,争夺资源时形成一个环状,a要b,b要c,c要a。
在百度搜了下,百度也有这个,解释如下:在《clr via c#》第二版(中文版,清华大学出版社出版)的第530页中第7行找到了这样的描述:“同样需要引起注意的是线程可以递归拥有同步块”。即同一线程可以递归调用lock语句。
---------------华丽分割线-----------------------
刚才试了下oc中的nslock,可是同样用上面的就会发生死锁的情况.
百度了下原来还有一个锁来解决这个的nsrecursivelock
将上面的nslock改为nsrecursivelock,就解决了。具体参考http://www.cocoachina.com/ios/20150513/11808.html
nsrecursivelock可以允许同一线程多次加锁,而不会造成死锁。递归锁会跟踪它被lock的次数。每次成功的lock都必须平衡调用unlock操作。只有所有达到这种平衡,锁最后才能被释放,以供其它线程使用。