Каскадная синхронизация с Java - PullRequest
1 голос
/ 07 мая 2011

Я очень старался найти информацию о проблеме, но ничего не относилось. Любой вклад будет оценен.

DataStructure ds = new DataStructure();
public synchronized void run() { b(); }
private void b() { ds.update(); }
public synchronized void c() { ds.update(); }

Предположим, что приведенный выше код реализован с использованием потока. как вы могли заметить, существует объект DataStructure, который используется совместно с синхронизированными методами, когда в любой момент времени может быть вызван только один синхронизированный метод (я не ошибаюсь. верно?). Есть ли вероятность, что объект DataStructure будет доступен через публичные методы несинхронизированным способом?

спасибо.

Ответы [ 3 ]

0 голосов
/ 07 мая 2011

Не видя больше кода, это очень трудно сказать.К какому классу принадлежат эти методы?как они вызываются и какими классами?

Проблемы с параллелизмом трудно диагностировать, и сложнее, если не хватает информации.

Я предполагаю, что у вас есть потоки, которые выполняют метод run () выше, и есть разные потоки, которые выполняют метод c ().Синхронизация происходит в классе, в котором находится вышеупомянутый метод, поэтому проблем не будет (кроме медленности, если много потоков).

0 голосов
/ 09 июля 2012

Если

  1. Нет другого публичного метода, кроме того, что вы здесь написали, который имеет доступ к ds, и
  2. «объект DataStructure», о котором вы говорите, является экземпляром объекта в конкретном экземпляре объекта вашего класса (вместо ВСЕХ объектов DataStructure)

тогда то, что вы ожидаете, верно. Не должно быть одновременного доступа к ds через открытые методы вашего класса.

Честно говоря, я не вижу в вашем классе ничего особенного, что отличало бы его от обычного примера синхронизированного метода.

0 голосов
/ 07 мая 2011

Ваш код неполон, но если вышеприведенное является частью Runnable или Thread, то параллелизм с данными методами невозможен, поскольку вы синхронизируете весь метод run().Использование потоков довольно бессмысленно в этом случае.

Я также не вижу, где DataStructure будет разделяться между потоками - похоже, для каждого создается отдельный файл.Если он на самом деле является общим, то доступ не будет синхронизирован, потому что вы синхронизируете на Runnable или Thread, а не на общем объекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...