It seems like the logic in this function (isWithinExpirationThreshold() line 198) should evaluate greater than the expiration threshold.
(credentialsExpiration.getTime() - System.currentTimeMillis()) < EXPIRATION_THRESHOLD;
I checked that our iam server response returns an expiration date that is 10 minutes from now() and this provider is still forcing a refresh on every request. Since this is a synchronized code block it is severely impacting performance.
It also would be good to add some TRACE or DEBUG message, when the provider has to refresh the credentials.