0

以下是Java并发实践书中讨论开放调用时的代码片段。我没有得到的一点是声明 setLocation 方法的方式,它已经同步并再次在同一方法中调用 synchronized(this) 块,为什么这样?是类型错误吗?同步方法已经持有该方法的锁,那么为什么还要为同一个对象呢?

   @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); 
        } 
    } 
4

1 回答 1

5

这是书中的错误。查看勘误表

在清单 10.6 中,Taxi.setLocation 不应该是同步方法。(但是,其主体中的同步块是正确的。)

于 2016-06-11T17:38:07.270 回答