知识大全 多线程中的死锁举例与分析
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相关参考