第一段代码来自于 《The Java Tutorial》
=================================
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s has bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s has bowed back to me!%n",
this.name, bower.getName());
}
}
public static void main(String[] args) {
final Friend alphonse = new Friend("Alphonse");
final Friend gaston = new Friend("Gaston");
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}
输出如下:
Alphonse: Gaston has bowed to me!
Gaston: Alphonse has bowed to me!
=============================
第二段是我看了上面这段代码之后自己写的基本一摸一样,唯一的区别在于红字处
public class DeadLockTest
{
static class BadMan
{
private final String name;
public BadMan(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public synchronized void bow(BadMan bower)
{
System.out.println(this.name+" :"+bower.getName()+" has bowed to me");
bower.bowBack(this);
}
public synchronized void bowBack(BadMan bower)
{
System.out.println(this.name+" :"+bower.getName()+" has bowed back to me");
}
}
public static void main(String[] args)
{
final BadMan ma=new BadMan("ma");
final BadMan li=new BadMan("li");
new Thread(new Runnable()
{
public void run()
{
ma.bow(li);
}
}).start();
new Thread(new Runnable()
{
public void run()
{
li.bow(ma);
}
}).start();
}
}
输出
li :ma has bowed to me
ma :li has bowed back to me
ma :li has bowed to me
li :ma has bowed back to me
===========================
说明我写的没有实现死锁,而区别仅仅在于输出语句上,为什么?
------解决方案--------------------
第一段代码准确的说是有会产生死锁的可能性,但不一定会发生死锁
你的第二段代码也是这样的,有可能但不一定会产生死锁
- Java code
public class Test { static class BadMan { private final String name; private boolean flag = true; public BadMan(String name) { this.name = name; } public String getName() { return this.name; } public synchronized void bow(BadMan bower) { System.out.println(this.name + " :" + bower.getName() + " has bowed to me"); if (flag) { Thread.currentThread().yield(); flag = false; } else { flag = true; } bower.bowBack(this); } public synchronized void bowBack(BadMan bower) { System.out.println(this.name + " :" + bower.getName() + " has bowed back to me"); } } public static void main(String[] args) { final BadMan ma = new BadMan("ma"); final BadMan li = new BadMan("li"); new Thread(new Runnable() { public void run() { ma.bow(li); } }).start(); new Thread(new Runnable() { public void run() { li.bow(ma); } }).start(); }}