我们可以像这样转换它:
class CooperatingNoDeadlock {
@ThreadSafe
class Taxi {
@GuardedBy(this) private Point location, destination;
private final Dispatcher dispatcher;
public Taxi(Dispatcher dispatcher) {
this.dispatcher = dispatcher;
}
public synchronized Point getLocation() {
return location;
}
public synchronized void setLocation(Point location) {
boolean reachedDestination;
// 加Taxi内置锁
synchronized (this) {
this.location = location;
reachedDestination = location.equals(destination);
}
// 执行同步代码块后完毕,释放锁
if (reachedDestination)
// 加Dispatcher内置锁
dispatcher.notifyAvailable(this);
}
public synchronized Point getDestination() {
return destination;
}
public synchronized void setDestination(Point destination) {
this.destination = destination;
}
}
@ThreadSafe
class Dispatcher {
@GuardedBy(this) private final Set<Taxi> taxis;
@GuardedBy(this) private final Set<Taxi> availableTaxis;
public Dispatcher() {
taxis = new HashSet<Taxi>();
availableTaxis = new HashSet<Taxi>();
}
public synchronized void notifyAvailable(Taxi taxi) {
availableTaxis.add(taxi);
}
public Image getImage() {
Set<Taxi> copy;
// Dispatcher内置锁
synchronized (this) {
copy = new HashSet<Taxi>(taxis);
}
// 执行同步代码块后完毕,释放锁
Image image = new Image();
for (Taxi t : copy)
// 加Taix内置锁
image.drawMarker(t.getLocation());
return image;
}
}
class Image {
public void drawMarker(Point p) {
}
}
}
使用公开通话是一种非常好的方法,您应该尝试使用它〜
使用显式Lock锁,获取锁时使用tryLock()方法. 当等待时间超过时间限制时,tryLock()不会永远等待多线程如何避免死锁,而是返回错误消息.
使用tryLock()可以有效避免死锁问题~~

尽管死锁的原因是我们设计得不好,但在编写代码时我们可能不知道死锁发生在什么地方.
JDK提供了两种测试方法:
具体参考:
造成僵局的主要原因是:
在执行方法时,您需要按住锁,并且不要释放永久等待状态
在操作系统级别查看死锁问题(这是我之前做的注释,非常简单):
参考:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-196408-2.html
就是想说什么就说什么
应该不是南京判的