zoukankan      html  css  js  c++  java
  • java多线程----死锁

    什么叫死锁?
    所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
        
    那么为什么会产生死锁呢?
    1.因为系统资源不足。
    2.进程运行推进的顺序不合适。    
    3.资源分配不当。
                 
    学过操作系统的朋友都知道:产生死锁的条件有四个:
    1.互斥条件:所谓互斥就是进程在某一时间内独占资源。
    2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
    4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

       

    例如:     

    死 锁是因为多线程访问共享资源,由于访问的顺序不当所造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想 去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。

    下面给出死锁的例子

    /**
     * 过多的同步方法可能造成死锁
     * 
     *
     */
    public class SynDemo03 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Object g =new Object();
            Object m = new Object();
            Test t1 =new Test(g,m);
            Test2 t2 = new Test2(g,m);
            Thread proxy = new Thread(t1);
            Thread proxy2 = new Thread(t2);
            proxy.start();
            proxy2.start();
        }
    
    }
    class Test implements Runnable{
        Object goods ;
        Object money ;
        
        public Test(Object goods, Object money) {
            super();
            this.goods = goods;
            this.money = money;
        }
    
        @Override
        public void run() {
            while(true){
                test();
            }
        }
        
        public void test(){
            synchronized(goods){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized(money){
                    
                }
                
            }
            System.out.println("一手给钱");
        }
        
        
    }
    
    class Test2  implements Runnable{
        Object goods ;
        Object money ;
        public Test2(Object goods, Object money) {
            super();
            this.goods = goods;
            this.money = money;
        }
    
        @Override
        public void run() {
            while(true){
                test();
            }
        }
        
        public void test(){
            synchronized(money){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized(goods){
                    
                }
                
            }
            System.out.println("一手给货");
        }
        
    }
    采菊东篱下,悠闲现南山~
  • 相关阅读:
    mysql安装脚本
    vim常用命令
    CentOS 6.5使用国内网易163的源
    053(七十五)
    053(七十四)
    053(七十三)
    053(七十二)
    053(七十一)
    053(七十)
    053(六十九)
  • 原文地址:https://www.cnblogs.com/ChaosJu/p/4758520.html
Copyright © 2011-2022 走看看