Назад к задачам
ЯндексПолучайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Junior — Senior
8
Анализ потокобезопасности метода создания сущности в DataService
Компании, где спрашивали:
Условие задачи
Требуется провести ревью кода класса DataService, отвечающего за работу с объектами Data. Метод create может вызываться одновременно из разных потоков, поэтому его реализация должна быть безопасна для многопоточного доступа. При этом AccessService и DataRepository уже гарантируют корректную работу в многопоточной среде. Нужно предложить варианты улучшения реализации и указать, в чём заключается текущая проблема, если она существует.
public class DataService {
private AccessService accessSrv;
private DataRepository repo;
private MessageDigest mdDigest = createDigest();
public DataService(AccessService accessSrv, DataRepository repo) {
this.accessSrv = accessSrv;
this.repo = repo;
}
public Data get(String uid) {
accessSrv.checkRead();
return repo.get(uid);
}
public void create(String name) {
accessSrv.checkWrite();
mdDigest = createDigest();
repo.save(new Data(
HexFormat.of().formatHex(mdDigest.digest(name.getBytes())),
name
));
}
public static MessageDigest createDigest() {
try {
return MessageDigest.getInstance("md5");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException();
}
}
public record Data(
String uid,
String name
) {}
public interface DataRepository {
void save(Data data);
Data get(String uid);
}
public interface AccessService {
void checkRead();
void checkWrite();
}
}