JAVA中的死锁问题


下面是一段 强制死锁出现的代码,基本我都懂,但有几个小细节不是很明白

class A {
public synchronized void funA(B b) {
String name=Thread.currentThread().getName();
System.out.println(name+"进入funA");
try {
Thread.sleep(1000);
}
catch(Exception e) {
System.out.println("e.getMassage()");
}
System.out.println(name+"调用B类中的last()方法");
b.last();
}
public synchronized void last() {
System.out.println("A类中的last()");
}
}
class B {
public synchronized void funB(A a) {
String name=Thread.currentThread().getName();
System.out.println(name+"进入funB");
try {
Thread.sleep(1000);
}
catch(Exception e) {
System.out.println("e.getMassage()");
}
System.out.println(name+"调用A类中的last()方法");
a.last();
}
public synchronized void last() {
System.out.println("B类中的last()");
}
}
public class DeadLockDemo implements Runnable {
A a=new A();
B b=new B();
DeadLockDemo() {
Thread.currentThread().setName("main---->>Thread");
new Thread(this).start();
a.funA(b);
System.out.println("main线程运行完毕");
}
public synchronized void run() {
Thread.currentThread().setName("text---->>Thread");
b.funB(a);
System.out.println("Text线程运行完毕");
}
public static void main(String args[]) {
new DeadLockDemo(); 
}
}
---------------------------------
一问:请看class A类中的funA方法最后一句调用了 b.last() ,b.last()虽然是 synchronized 的,但是并没有其他线程进入到b.last()啊? 为什么会出现死锁呢?
二问:代码倒数第14行, DeadLockDemo() 这个构造方法的访问控制符是默认的default, 却不是public, 请问default DeadLockDemo() 和public DeadLockDemo() 不会向矛盾吗?
最后请问:new Thread(this).start(); 这句中的this 代表什么啊?

---------------------------------

第一个问题
首先,同步方法利用的是this所代表的对象的锁。即
类A中的funA和las方法用的都是类A对象的锁,类B中的funB和las方法用的都是类B对象的锁
当主线程执行到b.las();的时候主线程试图获取类B对象锁的拥有权,但这时候text线程执行的funB方法还没有执行完毕,主线程也就无法获取类B对象锁的拥有权。同理这时text线程执行到a.last()时,text线程试图获取类A对象锁的拥有权,但这时主线程扫行的funA方法还没有执行完毕,text线程也就无法获得类A对象锁的拥有权,两个线程相互等待,于是导致了死锁。
第二个问题
因为main方法在DeadLockDemo类中,即使是private DeadLockDemo() 也能构造DeadLockDemo类对象
第三个问题
this代表的是DeadLockDemo类对象,第创建一个DeadLockDemo类对象就有一个this引用指向该对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值