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

    死锁在并发编程中是需要避免的,要修正死锁问题,必须明白死锁发生的条件:

    1.互斥条件:

    任务中使用的资源至少有一个是不能共享的

    2.请求与保持条件:

    一个进程因请求资源而阻塞时,对已获得的资源保持不放。 

    3.不剥夺条件:

    进程已获得的资源,在末使用完之前,不能强行剥夺。 

    4.循环等待条件:

    若干进程之间形成一种头尾相接的循环等待资源关系。 

    下面我们着手实现一个死锁:

    public class DeadThread implements Runnable {
        public String username;
        public Object lock1=new Object();
        public Object lock2=new Object();
        public void setFlag(String username){
            this.username=username;
        }
        @Override
        public void run() {
            if(username.equals("a")){
                synchronized (lock1){
                    try {
                        System.out.println("username="+username);
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    synchronized (lock2){
                        System.out.println("按lock1->lock2顺序执行了");
                    }
                }
            }
    
            if(username.equals("b")){
                synchronized (lock2){
                    try {
                        System.out.println("username="+username);
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    synchronized (lock1){
                        System.out.println("按lock2->lock1顺序执行了");
                    }
                }
            }
        }
    }
    
    public class Run {
        public static void main(String[] args) {
            DeadThread d1=new DeadThread();
            d1.setFlag("a");
            Thread t1=new Thread(d1);
            t1.start();
    
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            d1.setFlag("b");
            Thread t2 = new Thread(d1);
            t2.start();
        }
    }
  • 相关阅读:
    用css实现三角形
    css实现加载中的效果
    图片轮播图插件
    支付密码框
    angular里面ng-class的几个用法
    Redis数据恢复
    Jenkins简单介绍
    spring框架中定时器的配置及应用
    springMVC与freemarker的整合
    freemarker入门小例子
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/9293992.html
Copyright © 2011-2022 走看看