Data Race Detector
by Devexperts
DRD ищет 2 разновидности гонок:
Гонка всегда происходит между текущим потоком (current thread) и каким-то еще (racing thread), который ранее осуществил обращение в полю/вызов метода, которое и образует гонку с соответствующим обращением к полю/вызовом метода в текущем потоке.
Типы гонок: WRITE_WRITE, READ_WRITE, WRITE_READ. На первом месте - current thread, на втором - racing thread.
%race_type% data race occurred between currend thread %name% %id% and thread %name% %id%
Race target: FIELD %class%.%name%
Current thread %id%: %caller_class%.%caller_method% (line: %line%)
Racing thread %id%: %caller_class%.%caller_method% (line: %line%)
Race target: METHOD calls on %class%
Current thread %id%: called %class%.%method% from %caller_class%.%caller_method% (line: %line%)
Racing thread %id%: called %class%.%method% from %caller_class%.%caller_method% (line: %line%)
+ в обоих случая выводится стектрейс текущего потока и стектрейс racing-потока, если есть
Получается, полностью гонка определяется следующими параметрами:
Гонка по полю:
Гонка по foreign call-ам:
DRD предоставляет возможность выставить уровень группировки гонок (property "drd.races.grouping"):