Как найти все синхронизированные на одном мониторе в Java с Eclipse? - PullRequest
7 голосов
/ 24 июня 2011

С Eclipse можно найти все ссылки на метод, член или класс.Можно ли также найти все ссылки на синхронизированный монитор?

Если это невозможно с Eclipse, то возможно ли это с помощью другой Java IDE?

Моя проблема заключается в том, что объект мониторашляпа много ссылок.Поиск по всем ссылкам даст много результатов.Я только увижу, где синхронизируются с этим объектом.

РЕДАКТИРОВАТЬ: я добавляю образец, что я имею в виду:

public class LockClass{
  public synchronized void add(Object any){
  }
}

public class AnyOther{
  private LockClass lock;

  public AnyOther(LockClass lock){
    this.lock = lock;
  }

  public void doSomethings(){
    synchronized(lock){
      //...
    }
}

Теперь я хочу найти все синхронизированные, которые используют LockClass в качестве монитора.Это статический анализ.В моем примере я хочу найти:

  • LockClass.add
  • AnyOther.doSomethigs

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Чтобы найти ссылки: Select your element->rt-click menu->References->workspace

Невозможно найти все возможные синхронизированные блоки на одном и том же объекте, потому что фактический объект, на который указывает ссылка, будет зависеть во время выполнения.

1 голос
/ 24 июня 2011

Давайте проясним некоторые термины:

  • Монитор синхронизированного блока фактически является монитором объекта
  • Ссылки на монитор синхронизируемого неоднозначны: вы хотите, чтобы все места в коде, на которые ссылается этот монитор, или все поля / локальные переменные, которые указывают на монитор?

Где в коде содержится ссылка на монитор?

Сурадж уже описывает, как это сделать: Search > References > Workspace.... Вы также можете отфильтровать эти ссылки только для доступа на чтение, на запись, для разработчиков и т. Д. Такие ссылки можно найти с помощью статического анализа кода, поэтому запускать приложение не нужно. Это, однако, не будет автоматически обнаруживать случаи, когда ссылка на объект присваивается полю, которое затем присваивается другой переменной. Это только обнаруживает ссылку на эту конкретную ссылку на объект.

Какие переменные указывают на монитор?

Это будет обрабатывать случай, когда несколько полей / локальных переменных ссылаются на объект. Для этого приложение должно быть запущено. Вам необходимо установить точку останова в надлежащем месте, где монитор виден (самый простой способ - где-то вокруг синхронизированного блока, в котором используется данный монитор). В представлении «Переменные» будут показаны все переменные, доступные в текущей области. Вы можете получить все ссылки на объект, выбрав ссылку на объект в представлении переменных, выведя контекстное меню и выбрав All References.... Это покажет вам все поля / локальные переменные, которые ссылаются на объект.

1 голос
/ 24 июня 2011

Eclipse не сможет найти ссылки на определенный объект. Он может найти только ссылки на определенный символ, например, переменная, класс, метод a.s.o. Монитор может иметь значение this или значение переменной o - оба указывают на один и тот же объект во время выполнения. Однако Eclipse не имеет возможности извлекать такую ​​информацию во время выполнения.

...