notifyAll () разница в количестве вызовов при профилировании

Я реализовал простой профилировщик с JVMTI для отображения вызова wait () и notifyAll () . В качестве тестового примера я использую. производитель-потребитель, пример Oracle . У меня есть три следующих события:

  • вызывается notifyAll ()
  • вызывается wait ()
  • остается wait ()

Вызов wait () и когда он остается профилируется с помощью событий MonitorEnter и MonitorExit . Вызов notifyAll () профилируется при выходе из метода с именем notifyAll .

Теперь у меня есть следующие результаты, первый получен профилировщиком сам и второй взят из Java , где я поместил соответствующий оператор System.out.println .

    // Profiler:
    Thread-1 invoked notifyAll()
    Thread-0 invoked notifyAll()
    Thread-0 invoked notifyAll()
    Thread-0 invoked notifyAll()
    Thread-0 invoked notifyAll()
    Thread-0 invoked notifyAll()
    Thread-1 invoked notifyAll()
    Thread-1 invoked notifyAll()
    Thread-1 invoked notifyAll()
    Thread-1 invoked notifyAll()
    Thread-1 invoked notifyAll()
    Thread-1 invoked notifyAll()
    Thread-1 invoked notifyAll()
    Thread-1 invoked wait()
    Thread-1 left wait()
    Thread-1 invoked notifyAll()
    Thread-1 invoked wait()
    Thread-1 left wait()
    Thread-1 invoked notifyAll()
    Thread-1 invoked wait()
    Thread-1 left wait()
    Thread-1 invoked notifyAll()

    // Java:
    Thread-0 invoked notifyAll()
    Thread-1 invoked notifyAll()
    Thread-0 invoked notifyAll()
    Thread-1 invoked notifyAll()
    Thread-0 invoked notifyAll()
    Thread-1 invoked wait()
    Thread-1 invoked notifyAll()
    Thread-0 invoked notifyAll()
    Thread-1 invoked wait()
    Thread-1 invoked notifyAll()
    Thread-0 invoked notifyAll()
    Thread-1 invoked wait()
    Thread-1 invoked notifyAll()

Есть ли у кого-нибудь объяснение, откуда взялось это несоответствие? notifyAll () вызывается столько раз. Мне сказали, что это может быть связано с ложноположительными ответами на запрос Java к операционной системе.

Запрос notifyAll () отправляется операционной системе, и отправляется ложноположительный ответ , где похоже, что запрос был успешным. Так как notifyAll регистрируется при вызове метода профилирования вместо MonitorEnter , это может объяснить, почему этого не происходит с wait.

Я забыл сказать, что я не запускал программы отдельно , оба журнала относятся к одному и тому же исполнению.

Дополнительная информация

Первоначально добавлено в качестве ответа, перемещено на вопрос extraneon:

Кажется, я обнаружил, откуда некоторые дополнительных notifyAll, я добавил профилирование контекста метода, в котором вызывается notifyAll:

723519: Thread-1 invoked notifyAll() in Consumer.take
3763279: Thread-0 invoked notifyAll() in Producer.put
4799016: Thread-0 invoked notifyAll() in Producer.put
6744322: Thread-0 invoked notifyAll() in Producer.put
8450221: Thread-0 invoked notifyAll() in Producer.put
10108959: Thread-0 invoked notifyAll() in Producer.put
39278140: Thread-1 invoked notifyAll() in java.util.ResourceBundle.endLoading
40725024: Thread-1 invoked notifyAll() in java.util.ResourceBundle.endLoading
42003869: Thread-1 invoked notifyAll() in java.util.ResourceBundle.endLoading
58448450: Thread-1 invoked notifyAll() in java.util.ResourceBundle.endLoading
60236308: Thread-1 invoked notifyAll() in java.util.ResourceBundle.endLoading
61601587: Thread-1 invoked notifyAll() in java.util.ResourceBundle.endLoading
70489811: Thread-1 invoked notifyAll() in Consumer.take
75068409: Thread-1 invoked wait() in Drop.take
75726202: Thread-1 left wait() in Drop.take
77035733: Thread-1 invoked notifyAll() in Consumer.take
81264978: Thread-1 invoked notifyAll() in Consumer.take
85810491: Thread-1 invoked wait() in Drop.take
86477385: Thread-1 left wait() in Drop.take
87775126: Thread-1 invoked notifyAll() in Consumer.take

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

11
задан extraneon 7 May 2011 в 09:33
поделиться