Вы не поделились кодом, который выполняет фактическую обработку ошибок / запускает повторную инициализацию. Я предполагаю, что вы вызываете метод при возникновении исключения IOException. Чтобы избежать этого, например, временные проблемы с сетью приводят к тысячам или миллионам повторных инициализаций без инициализации, я бы предложил указать минимальное время между двумя повторными инициализациями. Это также помогает упростить код:
public YourClass {
...
private static final long MIN_TIME_BETWEEN_TWO_REINITIALIZES = 60 * 1_000; // 1 min
privat static long lastReinitialize = 0;
public static AmazonS3 reinitializeAndProvideS3Client() throws Exception {
synchronized (YourClass.class) {
long now = System.currentTimeInMillis();
if (now - lastReinitialize > MIN_TIME_BETWEEN_TWO_REINITIALIZES ) {
s3Client.shutdown();
s3Client = createAmazonS3Client();
lastReinitialize = now;
}
return s3Client;
}
}
}
Я предполагаю, что поле s3Client является изменчивым, а реализация s3Client является поточно-ориентированной. Если s3Client не должен быть изменчивым и доступ к нему уже должен быть синхронизирован другим объектом, замените YourClass.class в операторе synchronized на этот объект.