lock(m1) lock(m2) unlock(m1) lock(m1) unlock(m2) unlock(m1) 假设A线程执行完第一步即将执行第二步: A线程:lock(m1) -> lock(m2) B线程执行完第三步,即将执行第四步 B线程:lock(m1) lock(m2) unlock(m1) ->lock(m1) 即 lock(m2) -> lock(m1) 线程A锁住了m1对象,然后尝试对m2对象进行加锁,同时线程B已经锁住了m2对象,接着尝试对m1对象进行加锁。
这时死锁就发生了。线程A永远得不到m2,线程B也永远得不到m1。为了得到彼此的对象(A和B),它们将永远阻塞下去。 具体请参见 http://blog.csdn.net/wt_better/article/details/72765333
执行步骤 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
代码 | lock(m1) | lock(m2) | unlock(m1) | lock(m1) | unlock(m2) | unlock(m1) |
线程1 | 1执行,占有m1 | 1执行,占有m1 && m2 | 1执行,占有m2 | 1暂停,线程2执行 | ||
线程2 | 1暂停,2执行,占有m1 | 1暂停,2执行,占有m1,申请m2(但是被线程1占有) | ||||
线程1 | 1继续执行,占有m2,申请m1(被2占有) |
所以,答案选C。
C
死锁的条件就是,在某一线程中存在 lock(m1) 的时候想去拿 m2 的锁,和在另一线程中拥有 lock(m2) 的时候想去拿 m1 的锁。
实际的一个例子就是:
上面线程A刚拿到m1锁,下一步期待拿到m2锁,而线程B(走了3步)已经拿到了m2的锁,下一步期待拿到m1锁。
lock(m1) lock(m2) unlock(m1) 后如果m1被另一个进程申请到lock(m1),现在第一个进程申请m1,第二个申请m2,就会进入死锁