知识大全 多线程中的死锁举例与分析

Posted

篇首语:亦余心之所善兮,虽九死其犹未悔。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 多线程中的死锁举例与分析相关的知识,希望对你有一定的参考价值。

   一个特殊构造的程序

  考虑下面这个专门为说明多线程中的死锁现象而构造的程序

  import java util LinkedList;

  public class Stack

  public static void main(String[] args)

  final Stack stack = new Stack();

  new Thread( push )

  @Override

  public void run()

  for(int i = ; i < ; i++)

  

  try

  Thread sleep( );

   catch (InterruptedException e)

  stack push( object + i);

  

  

   start();

  new Thread( pop )

  @Override

  public void run()

  for(int i = ; i < ; i++)

  

  try

  System out println(stack pop());

   catch (Exception e)

  

  

   start();

  

  LinkedList<Object> list = new LinkedList<Object>();

  public synchronized void push(Object x)

  System out println( begin to push + x);

  synchronized (list)

  list addLast(x);

  notify();

  

  System out println( end to push + x);

  

  public synchronized Object pop() throws Exception

  System out println( begin to pop );

  synchronized (list)

  if (list size() <= )

  wait();

  

  return list removeLast();

  

  

  

  该程序构造了一个 Stack 启动了两个线程 一个线程向 Stack 中添加数据 另外一个线程从 Stack 中取出数据并打印 但是运行程序后就会发现程序输出

  begin to pop

  begin to push object

  后 在再也没有后续输出了

   Dump 并分析线程状态

  启动 jvisualvm 查看该程序线程的状态 将其 Dump 就可以得到以下结果

   pop prio= tid= x b nid= x in Object wait() [ x eaf x eafd ] java lang Thread State: WAITING (on object monitor) at java lang Object wait(Native Method)

   waiting on < x ee > (a Stack)

  at java lang Object wait(Object java: ) at Stack pop(Stack java: ) locked < x ee > (a java util LinkedList)

   locked < x ee > (a Stack)

  at Stack$ run(Stack java: )

  Locked ownable synchronizers:

   None

   push prio= tid= x b nid= x waiting for monitor entry [ x e f x e fd ] java lang Thread State: BLOCKED (on object monitor) at Stack push(Stack java: ) waiting to lock < x ee > (a java util LinkedList)

   locked < x ee > (a Stack)

  at Stack$ run(Stack java: )

  Locked ownable synchronizers:

   None

  可以看到 pop 线程正在运行 wait(); 语句 处于 WAITING 状态 同时 该线程锁住了 list 和 stack 对象 push 线程处于 BLOCKED 状态 等待其他线程释放 list 对象

   运行过程及死锁原因分析

  

  步骤

  主程序

  pop 线程

  push 线程

  

  启动

  

  创建 stack 对象

  

  创建 list 对象

  

  启动

  

  启动

  

  sleep ms

  

  调用 stack pop()

  

  锁住 stack 对象

  

  打印 begin to pop

  

  锁住 list 对象

  

  调用 stack wait()(暂时释放 stack 对象)

  

  锁住 stack 对象

  

  打印 begin to push

  

  企图锁住 list 对象(发现 list 已被其他线程锁住)

  

  进入死锁状态

cha138/Article/program/Java/gj/201311/27384

相关参考

知识大全 Java Swing多线程死锁问题解析

JavaSwing多线程死锁问题解析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在基于Jav

知识大全 批处理程序中的“多线程”处理代码

大家都知道批处理中运行的都是一步步单进程执行 但如果进程执行比较慢如PING一个不通的IP地址那就会大大影响批处理程序的执行效率  如下内容将简单举例在WINDOWS下使用批处理做多进程并发

知识大全 死锁

  由于线程可能进入堵塞状态而且由于对象可能拥有同步方法——除非同步锁定被解除否则线程不能访问那个对象——所以一个线程完全可能等候另一个对象而另一个对象又在等候下一个对象以此类推这个等候链最可怕的情形

知识大全 Java多线程问题及处理(笔记)

Java多线程问题及处理(笔记)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  死锁  多线程编

知识大全 Java多线程处理三大讲解

Java多线程处理三大讲解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!死锁  

知识大全 深入解析PHP中的(伪)多线程与多进程

深入解析PHP中的(伪)多线程与多进程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本篇文章是对P

知识大全 超线程多核心下Java多线程编程分析

超线程多核心下Java多线程编程分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一Java环

知识大全 超线程多核心下Java多线程编程技术分析[4]

超线程多核心下Java多线程编程技术分析[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 超线程多核心下Java多线程编程技术分析[3]

超线程多核心下Java多线程编程技术分析[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 超线程多核心下Java多线程编程技术分析[1]

超线程多核心下Java多线程编程技术分析[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb