本帖最后由 slatop@qq.com 于 2013-6-14 09:30 编辑
我的就是非常典型的死锁程序,只不过在逻辑处理上使用的是两个this锁,而这也正是很容易忽略的问题,我的死锁和你的死锁,完全是一马事,并不是你所说的,一个线程没有释放。你仔细看就明白了。
同步函数DeadLockMethod()使用的是this锁,而两个线程的this锁并不是同一个对象的(一个线程的同步函数用的是deadlock1标记对象锁,另一个是deadlock2标记对象锁),在线程开启前又分别将deadlock1的引用存入deadlock2的deadlock成员上,而deadlock2的成员deadlock上记录deadlock1的引用,在DeadLockMethod()函数体内使用当前对象的deadlock做为标记设定了一个同步代码块。
也就是说这里的同步代码块上的标记对象锁其实就是另一个线程对象,而同步函数使用的标记对象就是自身的线程对象。
用流程来说,线程1进入同步函数,拿到锁1,线程2进步同步函数拿 到的是锁2,虽然同步函数的标记对象都是this但这个this并不相同,接着线程1去拿同步区的锁,也就是锁2,而锁2已经被线程2拿了。锁2去拿同步区的锁1,结果锁1已经被线程1拿了。
能看明白了吗?我的这种死锁原理和大家平时见的死锁原理一样,只是非常非常非常容易被忽略掉。所以一经发现立即共享给大家了 |