黑马程序员技术交流社区
标题:
死锁
[打印本页]
作者:
罗宵
时间:
2012-7-26 20:33
标题:
死锁
public class DeadLock implements Runnable {
Object locka=new Object();
Object lockb=new Object();
@Override
public void run() {
while(true){
synchronized (locka) {
System.out.println("11locka");
synchronized (lockb) {
System.out.println("11lockb");
}
}
synchronized (lockb) {
System.out.println("22lockb");
synchronized (locka) {
System.out.println("22locka");
}
}
}
}
}
public class Test {
public static void main(String[] args) {
DeadLock dk=new DeadLock();
Thread t1=new Thread(dk,"aa");
Thread t2=new Thread(dk,"bb");
t1.start();
t2.start();
}
}
这样也可以死锁,但是在while里面线程为什么可以直接去走第二个锁
作者:
肖琦
时间:
2012-7-26 20:51
在while循环的上半段中,t1或t2必然有一个首先持有locka的内部锁,设为x1,此时另外一个(设为x2)线程阻塞,由于lockb没有被锁定,
x1继续持有lockb的内部锁,然后分别出了两个synchronized 语句块,即分别释放了lockb和locka的内部锁。
现在,x1即将进入下半段程序,此时,如果x2持有了上半段locka的锁,x1持有了下半段lockb的锁,
则:x2继续试图持有上半段的lockb的锁,x1继续试图持有下半段locka的锁,但是locka,lockb现在分别被x2,x1持有,于是x1,x2你等我,我等你,程序陷入死锁
希望对你有帮助.....
作者:
罗宵
时间:
2012-7-26 21:31
肖琦 发表于 2012-7-26 20:51
在while循环的上半段中,t1或t2必然有一个首先持有locka的内部锁,设为x1,此时另外一个(设为x2)线程阻塞 ...
嗯,,谢谢咯,
作者:
淡然
时间:
2012-7-26 22:04
public void run() {
while(true){
synchronized (locka)
{//假设t1得到locka,则t2等待locka
System.out.println("11locka");
synchronized (lockb)
{//t1得到lockb,并释放locka,t2有可能得到locka,并在此等待lockb被释放
System.out.println("11lockb");
}
}
synchronized (lockb)
{//t1持有lockb继续执行
System.out.println("22lockb");
synchronized (locka)
{//此时t1等待locka被释放,t2则继续等待lockb被释放
System.out.println("22locka");
}
}
}
作者:
刘海源
时间:
2012-7-26 22:07
class DeadLock implements Runnable {
Object locka = new Object();
Object lockb = new Object();
@Override
public void run() {
while (true) {
synchronized (locka) {
System.out.println("11locka");
synchronized (lockb) {
System.out.println("11lockb");
}
}
synchronized (lockb) {
System.out.println("22lockb");
synchronized (locka) {
System.out.println("22locka");
}
}
}
}
}
public class Test {
public static void main(String[] args) {
DeadLock dk = new DeadLock();
Thread t1 = new Thread(dk, "aa");
Thread t2 = new Thread(dk, "bb");
t1.start();
t2.start();
}
}
//因为你创建了两个线程,而且每个线程都有各自的锁,同时呢他们都有执行资格和但是
//执行权是谁的呢CUP说了算,当线程t1拿着locka锁进入后打印出了11locka但是locka并没有释放锁
//如果是理想情况下就接着就拿着锁lockb进入打印出11lockb
//但是CUP给谁执行权是随机的如果当拿着locka锁打印了11locka后但没释放锁,又线程t2获得了执行权
//那么打印出了22lockb当进如locka时因为没有锁所以进不去了,同样lockb也没释放锁,所以谁也进不去了
//造成了死锁
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2