Java死锁简单实例

代码转自: [url]http://leowzy.iteye.com/blog/740859[/url]

public class DeadLocker  implements Runnable
{
int field_1;

private Object lock_1=new int[1];

int field_2;

private Object lock_2=new int[1];

public void method1(int value){
synchronized (lock_1){
System.out.println(Thread.currentThread().getName()+ "lock1");
synchronized (lock_2){
field_1=0;field_2=0;
}
}
}


public void method2(int value){
synchronized (lock_2){
System.out.println(Thread.currentThread().getName()+ "lock2");
synchronized (lock_1){
field_1=0;field_2=0;
}
}
}


@Override
public void run()
{
method1(2);
method2(1);
}

public static void main(String[] args)
{
DeadLocker d=new DeadLocker();
Thread t1=new Thread(d,"Thread_monkey");
Thread t2=new Thread(d,"Thread dolphin");
t1.start();
t2.start();
}
}


程序的运行会产生很多种不同的结果,有的是顺利执行完毕,大多数都会产生死锁:

1. Thread_monkey lock1
Thread_monkey lock2
Thread dolphin lock1
Thread dolphin lock2
这种是顺利执行完毕的。因为monkey线程执行完毕后dolphin才开始执行。这种可以忽略。

2. Thread_monkey lock1
Thread_monkey lock2
Thread dolphin lock1
monkey在执行到method2()的时候,dolphin正好开始执行。
此时dolphin进入到了method1()的synchronized (lock_1),而monkey则进入到了method2()的synchronized(lock_2)。
这时两个线程分别在之前的synchronized块中锁定了对方接下来所要锁定的资源。
既是:
线程 已锁定对象 需要对象
monkey -> lock_2 lock_1
dolphin-> lock_1 lock_2

两个线程都在锁定了对方所需要的对象,同时等待对方释放自己需要的对象。
程序进入死锁状态。


具体细节都在上面的链接里。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值