黑马程序员技术交流社区
标题:
大家看看我这个死锁的程序写的对不对啊,要疯了
[打印本页]
作者:
徐传任
时间:
2012-9-17 20:07
标题:
大家看看我这个死锁的程序写的对不对啊,要疯了
麻烦大家给看看我这个死锁的程序的写的对不对啊,我感觉没什么错误啊,可是为什么每次的执行结果都相同啊,执行了n次打印出来的结果一模一样
class DeadLock implements Runnable {
public boolean flag = true;
public void run() {
if(flag) {
while(true) {
synchronized(Lock.locka) {
System.out.println(Thread.currentThread().getName()+"iflocka");
synchronized(Lock.lockb) {
System.out.println(Thread.currentThread().getName()+"iflockb");
}
}
}
} else {
while(true) {
synchronized(Lock.lockb) {
System.out.println(Thread.currentThread().getName()+"........lockb");
synchronized(Lock.locka) {
System.out.println(Thread.currentThread().getName()+".........locka");
}
}
}
}
}
}
class Lock {
public static Object locka = new Object();
public static Object lockb = new Object();
}
public class DeadLockTest1 {
public static void main(String[] args) {
DeadLock dl = new DeadLock();
Thread t1 = new Thread(dl);
Thread t2 = new Thread(dl);
t1.start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
dl.flag = false;
t2.start();
}
}
死锁这块弄一晚上了,麻烦明白的学哥学姐给俺讲讲,谢谢...
作者:
史小兵
时间:
2012-9-17 20:44
在多线程中线程启动后,cpu资源的分配是随机的,可能你执行100次都会是一样的,这没什么的。但是清楚死锁的概念就好了
即一组线程都持有资源,并且等待线程中其他线程的资源。
满足一下四点死锁就会发生:
互斥:一次只有一个线程可以使用一个资源
占有并等待:一个至少持有一个资源的线程等待获得有其他线程所持有的资源
非抢占:一个线程只有等到其执行完之后才会自动释放。
循环等待:等待资源之间存在环
记住以上几点就可以了!
作者:
徐传任
时间:
2012-9-17 20:51
史小兵 发表于 2012-9-17 20:44
在多线程中线程启动后,cpu资源的分配是随机的,可能你执行100次都会是一样的,这没什么的。但是清楚死锁的 ...
那我写的那个应该是没错是吧?
作者:
程振
时间:
2012-9-17 20:51
知道理论后,下面的代码就很好写了
class ThreadA extends Thread {
private Object x;
private Object y;
public ThreadA(Object x, Object y) {
this.x = x;
this.y = y;
}
@Override
public void run() {
while (true) {
synchronized (x) {
System.out.println("ThreadB 以获取x。。。。");
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ThreadA 正请求y:");
synchronized (y) {
System.out.println("ThreadA 以获取y。。。。");
}
System.out.println("ThreadA 释放y,,,,");
}
System.out.println("ThreadA 释放x,,,,");
}
}
}
class ThreadB extends Thread {
private Object x;
private Object y;
public ThreadB(Object x, Object y) {
this.x = x;
this.y = y;
}
@Override
public void run() {
while (true) {
synchronized (y) {
System.out.println("ThreadB 以获取y。。。。");
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ThreadB 正请求x:");
synchronized (x) {
System.out.println("ThreadB 以获取x。。。。");
}
System.out.println("ThreadB 释放x,,,,");
}
System.out.println("ThreadB 释放y,,,,");
}
}
}
public class DeadLock {
public static void main(String[] args) {
// 建立两个对象锁
Object x = new Object();
Object y = new Object();
// ThreadA先获取x,然后获取y
new ThreadA(x, y).start();
// ThreadA先获取y,然后获取x
new ThreadB(x, y).start();
// synchronized关键字获取对象时,如果没有获取会一直等待查询,知道获取
}
}
复制代码
作者:
徐传任
时间:
2012-9-17 20:51
我就是纳闷,难道我真就那么悲剧....
作者:
史小兵
时间:
2012-9-17 21:28
嗯,应该没问题的!或者你可以把sleep时间改的长一点试试就知道了
作者:
谭立文
时间:
2012-9-17 22:00
class DeadLock implements Runnable {
public boolean flag = true;
public void run() {
if(flag) {
while(true) {
synchronized(Lock.locka) {
System.out.println(Thread.currentThread().getName()+"iflocka");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(Lock.lockb) {
System.out.println(Thread.currentThread().getName()+"iflockb");
}
}
}
} else {
while(true) {
synchronized(Lock.lockb) {
System.out.println(Thread.currentThread().getName()+"........lockb");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(Lock.locka) {
System.out.println(Thread.currentThread().getName()+".........locka");
}
}
}
}
}
}
class Lock {
public static Object locka = new Object();
public static Object lockb = new Object();
}
public class test {
public static void main(String[] args) {
DeadLock dl = new DeadLock();
Thread t1 = new Thread(dl);
Thread t2 = new Thread(dl);
t1.start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
dl.flag = false;
t2.start();
}
}
作者:
黑马张涛
时间:
2012-9-17 22:09
class DeadLock implements Runnable {
public boolean flag = true;
DeadLock(boolean flag)//直接在构造函数这里设置标记
{
this.flag = flag;
}
public void run() {
if(flag) {
while(true) {
synchronized(Lock.locka) {
System.out.println(Thread.currentThread().getName()+"iflocka");
synchronized(Lock.lockb) {
System.out.println(Thread.currentThread().getName()+"iflockb");
}
}
}
} else {
while(true) {
synchronized(Lock.lockb) {
System.out.println(Thread.currentThread().getName()+"........lockb");
synchronized(Lock.locka) {
System.out.println(Thread.currentThread().getName()+".........locka");
}
}
}
}
}
}
class Lock {
public static Object locka = new Object();
public static Object lockb = new Object();
}
public class DeadLockTest{
public static void main(String[] args) {
Thread t1 = new Thread(new DeadLock(true));
Thread t2 = new Thread(new DeadLock(false));
t1.start();//这样t1,t2会同时去抢执行权,t1抢到a锁后,t2也拿到了b锁,然后才能发生死锁
t2.start();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2