powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JCIP 10.6 Cooperatibg deadlock
3 сообщений из 3, страница 1 из 1
JCIP 10.6 Cooperatibg deadlock
    #39413209
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такой вот @ThreadSafe класс есть в JCIP

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
@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;
            synchronized (this) {
                this.location = location;
                reachedDestination = location.equals(destination);
            }
            if (reachedDestination)
                dispatcher.notifyAvailable(this);
        }

        public synchronized Point getDestination() {
            return destination;
        }

        public synchronized void setDestination(Point destination) {
            this.destination = destination;
        }
    }


http://jcip.net/listings/CooperatingNoDeadlock.java
Я подозреваю, что это ошибка и метод setLocation не должен быть synchronized, но тем не менее давайте уберем этот synchronized

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
   public void setLocation(Point location) {
            boolean reachedDestination;
            synchronized (this) {
                this.location = location;
                reachedDestination = location.equals(destination);
            }
            if (reachedDestination)
                dispatcher.notifyAvailable(this);
        }


зачем
Код: java
1.
this.location = location;


делается внутри syncronized ?

Будут ли какие-то проблемы если мы ещё сузим syncronized до

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public void setLocation(Point location) {
            boolean reachedDestination;
            this.location = location;
            synchronized (this) {
                 reachedDestination = location.equals(destination);
            }
            if (reachedDestination)
                dispatcher.notifyAvailable(this);
     }



?

ну или вообще вот так сделать без синхронизации:


Код: java
1.
2.
3.
4.
5.
6.
7.
public void setLocation(Point location) {
            boolean reachedDestination;
            this.location = location;
            Destination d = destination;          
            if (location.equals(d))
                dispatcher.notifyAvailable(this);
     }
...
Рейтинг: 0 / 0
JCIP 10.6 Cooperatibg deadlock
    #39414526
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerну или вообще вот так сделать без синхронизации:
А за h-b на чтение destination Пушкин будет отвечать?
так-то
Код: java
1.
if ((this.location=location).equals(destination)) dispatcher.notifyAvailable(this);


еще проще, хотя мне например отсутствие проверки на null в любом случае не нравится.
...
Рейтинг: 0 / 0
JCIP 10.6 Cooperatibg deadlock
    #39414716
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев,

упс, да
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JCIP 10.6 Cooperatibg deadlock
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]