1、写不写参数问题
图1
对比
图2
发现若 new的类中有参数时,构造方法要写有参构造。否则不用写。
2、this的指代问题
package cn.itcast.deadlock;
class YuShi {
public synchronized void say(FuXie f) {
System.out.println("玉史:给我 30 亿欧圆,放了你儿子。");
f.get();
}
public synchronized void get() {
System.out.println("玉史终于得到了赎金,放了儿子,为了下次继续绑架。");
}
}
class FuXie {
public synchronized void say(YuShi y) {
System.out.println("付谢:放了我儿子,我给你 30 亿欧圆,不见人不给钱。");
y.get();
}
public synchronized void get() {
System.out.println("付谢救回了自己的儿子,于是开始哭那 30 亿。");
}
}
public class DeadLock implements Runnable {
static YuShi ys = new YuShi();
static FuXie fs = new FuXie();
public DeadLock() {
new Thread(this).start();
ys.say(fs);
}
@Override
public void run() {
// TODO Auto-generated method stub
fs.say(ys);
}
public static void main(String[] args) {
new DeadLock();
}
}
在该代码中,对构造方法里new对象有疑问:
思路:main方法里 new了DeadLock() 会默认调用DeadLock类的构造方法,然后执行了新建线程。在这里注意构造方法中的两行执行结果没有先后顺序,因为线程start了后只是资源申请了,不一定能立即新建线程,所以可能先执行了下一句后再执行此句。
注意,new Thread(this).start() 中的this指代类名DeadLock,若要写成传统方式则改为下面的代码。
代码也可以改成下面这样,将构造方法去掉,main函数里新建线程
package cn.itcast.deadlock;
class YuShi {
public synchronized void say(FuXie f) {
System.out.println("玉史:给我 30 亿欧圆,放了你儿子。");
f.get();
}
public synchronized void get() {
System.out.println("玉史终于得到了赎金,放了儿子,为了下次继续绑架。");
}
}
class FuXie {
public synchronized void say(YuShi y) {
System.out.println("付谢:放了我儿子,我给你 30 亿欧圆,不见人不给钱。");
y.get();
}
public synchronized void get() {
System.out.println("付谢救回了自己的儿子,于是开始哭那 30 亿。");
}
}
public class DeadLock implements Runnable {
static YuShi ys = new YuShi();
static FuXie fs = new FuXie();
@Override
public void run() {
// TODO Auto-generated method stub
fs.say(ys);
}
public static void main(String[] args) {
DeadLock dl = new DeadLock();
new Thread(dl).start();
ys.say(fs);
}
}