싱글 톤과 정적 클래스를 사용하는 스프링 부트 프로젝트 (RESTful 웹 서비스)에서 엉뚱한 라이브러리를 접해야하므로 여러 클라이언트가 RestController를 사용할 때 동기화 문제가 발생합니다.스프링 부트가 정적 클래스에 동기화 된 액세스
나는 동기화 된 방법으로 라이브러리의 사용을 감쌌지만 쓸모가 없다. 동시 사용은 계속 발생한다. 왜 동기화 된 동작을 얻을 수 있는지 이해할 수 없다.
도움 주셔서 감사합니다. @Anthony가 나는 ReentrantLock와 사용 제안으로
--- 솔루션 ---
, 아래의 구현을 볼 수 있습니다.
generateModel 메서드에서 위반 된 어설 션에서 파생 된 두 번째 문제는 로깅 라이브러리의 문제 (다른 문제)로 인해 오류 메시지를 인쇄하지 못합니다.
문제가 해결되었습니다. 감사합니다.
--- 코드 ---
public class ModelingLocker {
private static final ReentrantLock reentrantLock = new ReentrantLock();
private String modeling;
private File out;
public ModelingLocker(String modeling, File out) {
this.modeling = modeling;
this.out = out;
}
public File synchroModeling() throws EngineException {
reentrantLock.lock();
System.out.println(reentrantLock);
System.out.println(System.identityHashCode(reentrantLock));
try {
long id = Thread.currentThread().getId();
System.out.println(String.format("--start--> Thread=%d %s", id, modeling));
ModelingEngine.generateModel(out);
System.out.println(String.format("<--end-- Thread=%d %s", id, modeling));
} finally {
reentrantLock.unlock();
}
return out;
}
}
나는이 서비스는 휴식 컨트롤러 내에서 autowire가되는
@Service
public class ModelingService {
//...
@Async
public Future<Void> model(File file, String message) {
ModelingLocker modelingLocker = new ModelingLocker(message, file);
if (isWellFormed(modelingLocker.synchroModeling()) {
//...
}
return new AsyncResult<>(null);
}
//...
}
내에서 사용하고 generateModel 방법이기 때문에 내가 @Async 필요 긴 과제와 나는 클라이언트에게 201에 대답해야만한다.
동기화 된 방법은 어디에 두었습니까? 어떤 물체가 잠겨 있습니까? 다른 스레드가 동기화 된 메서드를 포함하는 클래스의 다른 인스턴스에 잠근다면 서로 기다릴 수 없습니다. – Jesper
재진입 잠금은 올바른 솔루션이어야하지만 작동하지 않습니다 ... –
그러면 가장 잘못된 방법으로 사용했을 가능성이 큽니다. 시도한 것을 보여 주어 사람들이 올바르게 사용하고 있는지 여부를 설명 할 수 있습니다. – Jesper