2016-10-11 3 views
1

싱글 톤과 정적 클래스를 사용하는 스프링 부트 프로젝트 (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에 대답해야만한다.

+0

동기화 된 방법은 어디에 두었습니까? 어떤 물체가 잠겨 있습니까? 다른 스레드가 동기화 된 메서드를 포함하는 클래스의 다른 인스턴스에 잠근다면 서로 기다릴 수 없습니다. – Jesper

+0

재진입 잠금은 올바른 솔루션이어야하지만 작동하지 않습니다 ... –

+0

그러면 가장 잘못된 방법으로 사용했을 가능성이 큽니다. 시도한 것을 보여 주어 사람들이 올바르게 사용하고 있는지 여부를 설명 할 수 있습니다. – Jesper

답변

2

Reentrant Lock을 사용해 보았는가? 예를 들어이 링크를 보시면됩니다. http://javarevisited.blogspot.com/2013/03/reentrantlock-example-in-java-synchronized-difference-vs-lock.html

+0

시도했습니다. 작동하지 않습니다! 정적 초기화 된 ReentrantLock이있는 클래스에 논리를 래핑했지만이 객체는 다른 스레드 내에서 다릅니다 ... 그래서 정적 라이브러리에 문제가있는 이유를 이해할 수 없습니다! –

+0

죄송합니다. 내가 틀 렸습니다. 그들은 같은 대상이지만 잠금 방법이 잠기지 않습니다! –

0

한 스레드가 액세스해야하는 메소드를 동기화하면됩니다.

+0

나는 노력했다. 작동하지 않습니다! –

관련 문제