Java线程的死锁

原创
2014/10/31 15:14
阅读数 103
package com.meson.threaddeadlock.test;

/*
 * @ meson
 * 
 * 死锁的列子
 * 
 * 张三向李四要书
 * 李四向张三要画
 */
class Zhangsan {//张三类
    //索要图书
    public void say() {
        System.out.println("张三对李四说你给我书我把画给你");
    }
    //得到书
    public void get() {
        System.out.println("Zhangsan得到了书!!");
    }
};

class Lisi {//李四类
    //索要画
    public void say() {
        System.out.println("李四对张三说你 给我画我把书给你");
    }
    //得到画
    public void get() {
        System.out.println("Lisi得打了画");
    }
};

public class ThreadDeadLock  implements Runnable{//线程类
    
    
    public  boolean flag = false;//一个判断标识 判断谁先说话
    private static Zhangsan z = new Zhangsan();
    private  static Lisi l = new Lisi();

    @Override
    public void run() {//重写run方法
        // TODO Auto-generated method stub

        if (flag) {//true 张三先说话
            synchronized (z) {//同步张三 别的程序不能操作
                z.say();
                
                
                //睡眠 一段时间
                try {
                    Thread.sleep(500);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                
                // 锁定李四 别的程序不能操作 
                //张三从李四手中得到画
                synchronized (l){
                    z.get();
                }
            }
            
        } else {
            synchronized (l) {//false李四先说话 同步李四 别的 不能进行操作
                l.say();
                
                
                //睡眠一段时间
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (z) {//得到画 同步张三才能得到张三手中的画
                    z.get();
                }
            }
            
        }

    }
    public static void main(String[] args) {
        
        
        ThreadDeadLock d1 = new ThreadDeadLock(    );
        ThreadDeadLock d2 = new ThreadDeadLock();
        d1.flag = true;
        d2.flag = false;
        Thread t1 = new Thread(d1);
        Thread t2 = new Thread(d2);
        //线程开始
        t1.start();
        t2.start();

    }
}


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部