线程同步 · 死锁

原创 2015年07月06日 17:30:20

线程同步

这是一个非常经典的例子,银行取钱。
关键是: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");
                    }
                }
            }
        }

    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JAVA_线程同步与死锁

  • 2012-08-16 11:45
  • 32KB
  • 下载

《Windows via C/C++》学习笔记 —— “线程同步”之“检测死锁”

本来这篇内容在书中是在“其他线程同步函数”这一节中的。这节中介绍了另外的几个等待函数,比如WaitForInputIdle、MsgWaitForMultipleObjects、WaitForDebug...

Java笔记六.线程同步、线程死锁

线程同步、线程死锁     在上一篇文章中,有一个模拟售卖火车票系统,在卖车票的程序代码中,极有可能碰到一种意外,就是同一张票号被打印两次多次,也可能出现打印出0甚至负数的票号。具体表现为:假设tic...

线程同步与互斥及死锁问题

线程我们之前已经总结过了,就是进程的一个执行分支。既然是一个执行分支,那么我们就可以定义两个线程,在定义一个全局变量,初始值置为0,让这两个线程,同时对这个全局变量进行++处理,1000次,10000...

Java中的线程同步及线程死锁复习

1 线程安全 在单线程程序中,每次只能做一件事情,后面的事情需要等待前面的事情完成后才可以进行,但是如果使用多线程程序,就会发生多个线程抢占资源的问题,从而产生线程安全问题。实质上线程安全问题来源于多...

线程同步/线程死锁

1.线程同步,一个关键字:synchronized 为什么有这个东西呢,假如有一个对象,里面有成员变量和方法,如果有很多线程都想访问它们,有可能造成用户想避免的结果。 我也举那个经典的例子...

JAVA线程同步与死锁

上一篇写到了JAVA初步认识线程,现在就说说自己对线程同步及死锁的认识。       线程的同步,是为了避免多个线程访问相同的数据对象时,对数据造成破坏。      下面模拟多个售票员销售同一列车的票...

线程同步与死锁

线程同步与死锁 课程大纲 一、 多线程共享数据 1、在多线程的操作中,多个线程有可能同时处理同一个资源,这就是多线程中的共享数据。 二、 线程同步 1、 解决数据共享问题,必须使用同步...

白话并发冲突与线程同步(2)——Monitor、lock和死锁

转载▼      竞赛暂时胜过它的目的,永远如此。对于要建立殖民地的殖民主义者,生活的意义就在于征服。士兵看不起移民,但是,征服的目的不就是要让移民定居下来吗?因此,在进步的狂热中,...

多线程模拟售票及线程同步与死锁

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ------------------- 写一个模拟现实售票的例子。 首先,定义...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)