`

Java出现死锁的情况

阅读更多

Java 死锁的实现条件
    当竞争资源或进程间推进顺序不当时,可能会出现死锁。
    关于死锁出现的条件,我们晦涩难懂的操作系统课本是这样总结的:
1,互斥条件
2,请求和保持条件
3,不剥夺条件
4,环路等待条件
看了这些东西,很多人会感到一头雾水。如果你不是计算机专业科班出身并且成绩不赖的话,也许会很难理解。虽然这些总结非常精辟,但我总觉得国内大部分教材精辟过头了。在Java中,我们并不需要了解这么多细节的东西。死锁产生的原因很简单。线程1锁住资源A等待资源B,线程2锁住资源B等待资源A,两个线程都在等待自己需要的资源 而这些资源被另外的线程锁住,这些线程你等我,我等你,谁也不愿意让出资源,这样死锁就产生了。举一个形象的例子2个人(2个线程)要过一个独木桥(资源),两人走到中间停下来等另外一个人让路,不幸的是没有人愿意让路,于是两人就无限期的等下去了。
程序代码:
public class DeadLockTest implements Runnable ...{
    public boolean flag = true;
    static Object res1 = new Object();
    static Object res2 = new Object();
    
    public void run() ...{
        if(flag) ...{
            /**//* 锁定资源res1 */
            synchronized(res1) ...{
                System.out.println(\"Resource 1 is locked. Waiting for Resource 2.\");
                try ...{
                    Thread.sleep(1000);
                }
                catch (InterruptedException e) ...{}
                /**//* 锁定资源res2 */
                synchronized(res2) ...{
                    System.out.println(\"Complete.\");
                } [Page]
            }
        }
        else ...{
            /**//* 锁定资源res2 */
            synchronized(res2) ...{
                System.out.println(\"Resource 2 is locked. Waiting for Resource 1.\");
                try ...{
                    Thread.sleep(1000);
                }
                catch (InterruptedException e) ...{}
                /**//* 锁定资源res1 */
                synchronized(res1) ...{
                    System.out.println(\"Complete.\");
                }
            }
        }
    }
    
    public static void main(String[] args) ...{
        DeadLockTest r1 = new DeadLockTest();
        DeadLockTest r2 = new DeadLockTest();
        r2.flag = false;
        Thread t1 = new Thread(r1);
        Thread t2 = new Thread(r2);      

        t1.start();
        t2.start();
    }
}
运行结果:
Resource 1 is locked. [Page]
Waiting for Resource 2.
Resource 2 is locked.

Waiting for Resource 1.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics