死锁问题 本帖最后由 java4study 于 2014-09-29 23:45:40 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public class DeadLockDemo { public static void main(String[] args) { DeadLock dl = new DeadLock(); DeadLock d2 = new DeadLock(); dl.start(); d2.start(); }}继承Thread类启动线程时(如上代码new了2个DeadLock对象), dl.obj1和d2.obj1是不同的对象(测试时打印出obj1的引用地址可证),所以run()方法中锁对象完全不同,2个线程互相毫无影响;实现Runnable接口启动线程时,run()方法都是使用的同一个锁对象,所以会死锁; class DeadLock implements Runnable{//为什么换成继承Thread类不会发生死锁~boolean flag = true;Object obj1 = new Object();Object obj2 = new Object(); public void run(){while (true){ if (flag){flag = false;synchronized (obj1){System.out.println(Thread.currentThread().getName()+" true...out");synchronized (obj2){System.out.println(Thread.currentThread().getName()+" true...in");}} }if (!flag){flag = true;synchronized (obj2){System.out.println(Thread.currentThread().getName()+" false...out");synchronized (obj1){System.out.println(Thread.currentThread().getName()+" false...in");}}}}}}class DeadLockDemo{public static void main(String[] args) {DeadLock dl = new DeadLock();Thread t0 = new Thread(dl);Thread t1 = new Thread(dl);t0.start();t1.start();}} 这个回答是对的。你对线程还不熟。Thread和Runnable的区别还没理解。 一个DeadLock 共用一个flag变量自然死锁,2个线程对象各自有各自的flag变量自然不会死锁。 厉害,果然是这样的,我打印出四个hashCode了,本来应该是两个对象锁的,实现Runnable的时候,是调用回DeadLock的run所以是同一对象,是这个道理吧? 帮忙分析下一个简单程序的执行过程? 请教 请教linux下的java环境配置方法 java -classpath的确定问题 费了一下午时间,终于把解析UTF8做好了 初学awt,第一个例程就出错,怀疑不是程序问题。 point中r equals方法麻烦达人们给讲解下 如何返回对象数组!? 用ROSE2000只能对JAVA项目反向工程得到类图,其它图怎么办? 为什么我的程序编译后生成很多*$1.class文件? 关于日期的一个小问题,求解答 Properties中数组越界了?
public static void main(String[] args) {
DeadLock dl = new DeadLock();
DeadLock d2 = new DeadLock();
dl.start();
d2.start();
}
}
继承Thread类启动线程时(如上代码new了2个DeadLock对象), dl.obj1和d2.obj1是不同的对象(测试时打印出obj1的引用地址可证),所以run()方法中锁对象完全不同,2个线程互相毫无影响;
实现Runnable接口启动线程时,run()方法都是使用的同一个锁对象,所以会死锁;
boolean flag = true;
Object obj1 = new Object();
Object obj2 = new Object();
public void run(){
while (true){
if (flag){
flag = false;
synchronized (obj1){
System.out.println(Thread.currentThread().getName()+" true...out");
synchronized (obj2){
System.out.println(Thread.currentThread().getName()+" true...in");
}
}
}
if (!flag){
flag = true;
synchronized (obj2){
System.out.println(Thread.currentThread().getName()+" false...out");
synchronized (obj1){
System.out.println(Thread.currentThread().getName()+" false...in");
}
}
}
}
}
}
class DeadLockDemo{
public static void main(String[] args)
{
DeadLock dl = new DeadLock();
Thread t0 = new Thread(dl);
Thread t1 = new Thread(dl);
t0.start();
t1.start();
}
}