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();
        }
    }
  • 相关阅读:
    WebForm中使用MVC
    CPAN镜像使用帮助
    关于XML文档的xmlns、xmlns:xsi和xsi:schemaLocation
    XML之命名空间的作用(xmlns)
    xml相关术语说明
    .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门
    BZOJ3734 : [Ontak2013]Miny
    BZOJ3448 : [Usaco2014 Feb]Auto-complete
    BZOJ3476 : [Usaco2014 Mar]The Lazy Cow
    BZOJ3619 : [Zjoi2014]璀灿光华
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/9293992.html
Copyright © 2011-2022 走看看