美文网首页
java 多线程死锁

java 多线程死锁

作者: Undo_0cc6 | 来源:发表于2018-06-07 19:24 被阅读0次

java经典问题多线程死锁问题。因为多个线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续运行下去。

在多线程下,“死锁”是必须避免的。

下面是死锁demo

package deadlock;

/**

* 这里使用的时嵌套等待锁,达到死锁现象。

*/

public class DealThreadimplements Runnable {

public Stringflag;

    public lock1 =new Object();  //锁1

    public lock2 =new Object(); //锁2

    public void setFlag (String flag){

                          this.flag = flag; //标记

    }

@Override

    public void run() {

                    if(flag.equals("a")){

                              synchronized (lock1) {

                                  try{

                                             System.out.println("flag = " +flag);

                                             Thread.sleep(3000); //让当前线程sleep3秒。

                                   }catch (InterruptedException e) {

                                            e.printStackTrace();

                           }

                     synchronized (lock2) {

                                     System.out.println("按lock1->lock2代码顺序执行");

                           }

                }

}

if(flag.equals("b")){

                        synchronized (lock2) {

                                     try{

                                           System.out.println("flag = " +flag);

                                                 Thread.sleep(3000);

                                         }catch (InterruptedException e) {

                                             e.printStackTrace();

                                         }

                                     synchronized (lock1) {

                                           System.out.println("按lock2->lock1代码顺序执行");

                                                 }

                              }

                   }

          }

}

package deadlock;

import deadlock.DealThread;

/**

* Created by tony on 2018/6/7.

*/

public class RunDealThread {

public static void main(String [] args){

try{

DealThread t1 =new DealThread();

            t1.setFlag("a");

            Thread thread1 =new Thread(t1);

            thread1.start();

            Thread.sleep(100);

            t1.setFlag("b");

            Thread thread2 =new Thread(t1);

            thread2.start();

        }catch (InterruptedException e) {

e.printStackTrace();

        }

}

}

运行结果:

flag = a

flag = b

两者的 System.out.println("按lockx->locky代码顺序执行");都没有输出。

线程1.得到锁lock1 进入方法,输出flag = a,该线程进入休眠3秒,三秒之后请求lock2,这段时间线程2得到lock2,并且运行输出flag = b,并且请求锁lock1。

这时:

                            持有                              请求

线程1                 lock1                              lock2

线程2                 lock2                             lock1

两线程相互持有对方所请求的锁,这样就产生了死锁。

Found one Java-level deadlock:

=============================

"Thread-1":

  waiting to lock monitor 0x000000000371a968 (object 0x000000076b7e7188, a java.lang.Object),

  which is held by "Thread-0"

"Thread-0":

  waiting to lock monitor 0x00000000037180d8 (object 0x000000076b7e7198, a java.lang.Object),

  which is held by "Thread-1"

Java stack information for the threads listed above:

===================================================

"Thread-1":

        at deadlock.DealThread.run(DealThread.java:41)

        - waiting to lock <0x000000076b7e7188> (a java.lang.Object)

        - locked <0x000000076b7e7198> (a java.lang.Object)

        at java.lang.Thread.run(Thread.java:745)

"Thread-0":

        at deadlock.DealThread.run(DealThread.java:28)

        - waiting to lock <0x000000076b7e7198> (a java.lang.Object)

        - locked <0x000000076b7e7188> (a java.lang.Object)

        at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

这是java堆栈的信息。

相关文章

  • Java自学-多线程 死锁

    Java 演示多线程死锁 当业务比较复杂,多线程应用里有可能会发生死锁 步骤 1 : 演示死锁 线程1 首先占有对...

  • 照本宣科的问题

    3条你遵循的多线程最佳实践三条最佳实践我觉得大多数Java程序员都应该遵循: 如何避免死锁?Java多线程中的死锁...

  • 多线程分析——死锁代码demo

    前言 本文主要是对Java多线程死锁代码demo的分析,对其过程以及死锁进行了大致的概括,希望对大家有帮助。 死锁...

  • 使用JDK自带的工具jstack找出造成运行程序死锁的原因

    Java多线程编程也是Java面试中经常考察的内容。刚接触Java多线程编程的朋友们,可能会不慎写出一些会导致死锁...

  • Java多线程-死锁的出现和解决

    Java多线程-死锁什么是死锁? 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释...

  • Synchronized关键字详解2(对非object持锁)

    4.死锁:同步方法容易造成死锁。Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁...

  • java 多线程死锁

    java经典问题多线程死锁问题。因为多个线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续运行下去。 ...

  • Java多线程:死锁

    姓名:郭金 学号:17101223407 【嵌牛导读】:之前看到一个用jstack查看死锁的例子。总结了一下:js...

  • 中级09 - Java多线程初步

    中级09 - Java多线程初步 介绍多线程带来的问题,以及基本解决方案。 竞争条件带来的数据错误问题 死锁的原...

  • 一个多线程死锁案例,如何避免及解决死锁问题?

    ​ 多线程死锁在java程序员笔试的时候时有遇见,死锁概念在之前的文章有介绍,大家应该也都明白它的概念,不清楚的去...

网友评论

      本文标题:java 多线程死锁

      本文链接:https://www.haomeiwen.com/subject/tpcnsftx.html