下面是一段 强制死锁出现的代码,基本我都懂,但有几个小细节不是很明白
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引用指向该对象。