Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JCIP 10.6 Cooperatibg deadlock / 3 сообщений из 3, страница 1 из 1
02.03.2017, 16:00
    #39413209
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JCIP 10.6 Cooperatibg deadlock
Вот такой вот @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
06.03.2017, 10:12
    #39414526
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JCIP 10.6 Cooperatibg deadlock
questionerну или вообще вот так сделать без синхронизации:
А за h-b на чтение destination Пушкин будет отвечать?
так-то
Код: java
1.
if ((this.location=location).equals(destination)) dispatcher.notifyAvailable(this);


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

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


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