• 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("一手给货");
        }
        
    }
    采菊东篱下,悠闲现南山~
  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/ChaosJu/p/4758520.html
Copyright © 2020-2023  润新知