Терминология

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%)

Гонка по foreign call

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"):