线程同步 · 死锁

原创 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");
                    }
                }
            }
        }

    }

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

一些防止多线程同步造成死锁的技巧

  • xiaoyafang123
  • xiaoyafang123
  • 2016年12月06日 11:55
  • 483

多线程同步与死锁深入分析

多线程同步与死锁深入分析 前言 在多线程开发中,同步与死锁是非常重要的,在本篇文章中,读者将会明白一下几点: 1、哪里需要同步 2、如何实现同步 3、以及实现同步之后会有哪些副作用 例子 ...
  • yangwenxue_admin
  • yangwenxue_admin
  • 2016年04月10日 17:53
  • 1877

Java 线程同步与死锁 学习笔记

Java 线程同步与死锁 学习笔记Java 线程同步与死锁 学习笔记 1 多线程共享数据 2 线程同步 3 同步准则 4 线程死锁 1、 多线程共享数据 在多线程操作中,多个线程可能同时处理同一个资源...
  • haha_zhan
  • haha_zhan
  • 2016年09月25日 10:02
  • 1061

Java多线程 线程同步与死锁

1.线程同步多线程引发的安全问题一个非常经典的案例,银行取钱的问题。假如你有一张银行卡,里面有5000块钱,然后你去银行取款2000块钱。正在你取钱的时候,取款机正要从你的5000余额中减去2000的...
  • kong_gu_you_lan
  • kong_gu_you_lan
  • 2017年02月25日 15:47
  • 833

Java多线程,线程同步synchronized,线程死锁【线程池常规用法】多线程并发处理

工作内容: 1.线程同步:synchronized (锁类) 2.线程死锁 3.生产者与消费者模式 4.线程练习 线程同步: Synchronized(Object){ 代码块 } Public ...
  • yingtian648
  • yingtian648
  • 2016年07月14日 09:01
  • 374

1线程同步:互斥量,死锁

1线程为什么要同步 A:共享资源,多个线程都可对共享资源操作。 B:线程操作共享资源的先后顺序不确定。 C:处理器对存储器的操作一般不是原子操作。 2互斥量 mutex操作原语 pthre...
  • toto1297488504
  • toto1297488504
  • 2014年09月25日 16:44
  • 1807

线程同步+锁内嵌套回调引发死锁

线程同步+锁内嵌套回调引发死锁
  • darklinden
  • darklinden
  • 2015年11月04日 06:49
  • 716

线程同步---死锁

  • confirmAname
  • confirmAname
  • 2014年03月31日 20:54
  • 317

Linux线程浅析[线程的同步和互斥之线程死锁,线程与信号的关系]

Linux线程浅析[线程的同步和互斥之线程死锁,线程与信号的关系] 线程死锁 线程与信号 记得以前在学习java线程的时候,也会接触死锁,当时不断强调锁千万不要不能去做嵌套,不然容易一个...
  • qq_29924041
  • qq_29924041
  • 2017年04月04日 22:51
  • 982

Java 多线程同步与死锁

在多线程中如何找到安全问题所在: 1,明确哪些代码是多线程运行代码 2,明确共享数据 3,明确多线程运行代码中哪些代码是操作共享数据的 静态的同步方法中,使用锁是该方法所在类的字节码文...
  • pjz90
  • pjz90
  • 2013年03月10日 14:51
  • 6025
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程同步 · 死锁
举报原因:
原因补充:

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