关闭

线程同步 · 死锁

标签: 线程同步synchronized
261人阅读 评论(0) 收藏 举报
分类:

线程同步

这是一个非常经典的例子,银行取钱。
关键是:public synchronized void run() 用关键字 synchronized

package multithread;

public class TestBank {
    public static void main(String[] args) {
        new TestBank().run();
    }


    public void run(){
        Family f = new Family();
        new Thread(f,"丈夫").start();
        new Thread(f,"妻子").start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        f.show();

    }


    class Family implements Runnable{
        private int saveMoney;
        private int getMoney;
        private int curMoney;
        private int times = 0;

        public Family(){
            saveMoney = 5000;
            getMoney = 2000;
            curMoney = 0;
        }

        @Override
        public synchronized void run() {
            System.out.println(Thread.currentThread().getName()+"取了:"+getMoney+"元");
            curMoney += getMoney;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            int temp = saveMoney - getMoney;
            saveMoney = temp;
            times = times+1 ;
        }

        public void show(){
            System.out.println("银行还有:"+saveMoney+" 家中还有:"+curMoney);
        }

    }
}

死锁

引起原因:synchronized 的嵌套

package multithread;


public class TestDeadLock {

    public static void main(String[] args) {
        new TestDeadLock().run();
    }

    public void run(){
        MyThread mt = new MyThread();
        new Thread(mt,"张三").start();
        new Thread(mt,"李四").start();
    }

    class MyThread implements Runnable{
        private int index = 0;
        private Object k1 = new Object();
        private Object k2 = new Object();
        private boolean flag = true;

        @Override
        public void run() {
            if(flag){
                flag = false;
                synchronized (k1) {
                    System.out.println(Thread.currentThread().getName()+":k1");
                    try {
                        Thread.sleep(100);
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    synchronized (k2) {
                        System.out.println(Thread.currentThread().getName()+":k2");
                    }
                }

            }else{
                flag = true;
                synchronized (k2) {
                    System.out.println(Thread.currentThread().getName()+":k2");
                    try {
                        Thread.sleep(100);
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    synchronized (k1) {
                        System.out.println(Thread.currentThread().getName()+":k1");
                    }
                }
            }
        }

    }

}
0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    最新评论