Java 死锁的实现 -Java学习笔记(28)

本文通过一个简单的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.");
                }

            }

        }

        
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.
Waiting for Resource 2.
Resource 2 is locked.
Waiting for Resource 1.
。。。(死锁)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值