gpt4 book ai didi

Java并发实践Listing10.6 synchronized

转载 作者:行者123 更新时间:2023-11-29 07:02:43 25 4
gpt4 key购买 nike

来自 jcip 10.6 的列表

 @ThreadSafe 
class Taxi {
@GuardedBy("this") private Point location, destination;
private final Dispatcher dispatcher;
...
public synchronized Point getLocation() {
return location;
}
public synchronized void setLocation(Point location) {
boolean reachedDestination;
synchronized (this) {
this.location = location;
reachedDestination = location.equals(destination);
}
if (reachedDestination)
dispatcher.notifyAvailable(this);
}
}

@ThreadSafe
class Dispatcher {
@GuardedBy("this") private final Set<Taxi> taxis;
@GuardedBy("this") private final Set<Taxi> availableTaxis;
...
public synchronized void notifyAvailable(Taxi taxi) {
availableTaxis.add(taxi);
}

public Image getImage() {
Set<Taxi> copy;
synchronized (this) {
copy = new HashSet<Taxi>(taxis);
}
Image image = new Image();
for (Taxi t : copy)
image.drawMarker(t.getLocation());
return image;
}
}

我的问题是:类 Taxi,方法 setLocation 被“this”同步使用了两次:第一次是在方法调用中,第二次是在方法内部。first synchronized 是冗余的吗?

方法 getLocation 也是同步的。它同步的目的是什么?由于 set reference 在 java 中是原子的,我认为不可能返回损坏的位置值。所以我认为在 getLoction 上同步也是多余的。

还有一个问题:如果我使位置可变,是否可以在 getLocation 中摆脱同步?

谢谢。

最佳答案

参见 http://jcip.net.s3-website-us-east-1.amazonaws.com/errata.html

p.214: In Listing 10.6, Taxi.setLocation should not be a synchronized method. (The synchronized block in its body is correct, however.)

关于Java并发实践Listing10.6 synchronized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23488545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com