Ensure that MethodParameter.findParameterIndex() is thread-safe
Prior to this commit, parallel invocations of MethodParameter.findParameterIndex() (invoked indirectly via SynthesizingMethodParameter.forParameter() and MethodParameter.forParameter()) could intermittently lead to an IllegalArgumentException being thrown due to a race condition in the internal implementation of the JDK's java.lang.reflect.Executable.getParameters() method. This commit addresses this issue by introducing a fallback for-loop that iterates over the candidate parameters a second time using equality checks instead of identity checks. Issue: SPR-17534
This commit is contained in:
parent
aa7f69a5d1
commit
81fde5ec41
|
@ -733,11 +733,19 @@ public class MethodParameter {
|
|||
protected static int findParameterIndex(Parameter parameter) {
|
||||
Executable executable = parameter.getDeclaringExecutable();
|
||||
Parameter[] allParams = executable.getParameters();
|
||||
// Try first with identity checks for greater performance.
|
||||
for (int i = 0; i < allParams.length; i++) {
|
||||
if (parameter == allParams[i]) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
// Potentially try again with object equality checks in order to avoid race
|
||||
// conditions while invoking java.lang.reflect.Executable.getParameters().
|
||||
for (int i = 0; i < allParams.length; i++) {
|
||||
if (parameter.equals(allParams[i])) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Given parameter [" + parameter +
|
||||
"] does not match any parameter in the declaring executable");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue