이 주제를 다루는 데있어 어떤 질문도 발견되지 않았으므로 다음과 같은 시나리오에서 솔루션을 공유 할 것이라고 생각했습니다. 그 대답은 명백 할 수도 있지만, 나는 긴 길을 찾아 냈다. :) 질문과 답변뿐 아니라 다른 솔루션에 대한 의견을 보내 주시면 감사하겠습니다.지연로드 게터 동기화시
시나리오 :
것은 당신이 다중 스레드 프로그램을 가지고 프로그램의 다른 부분에서 필요하지 않은 동안 프로그램의 일부 기능에 대한 데이터베이스 연결 (또는 다른 공유 객체를)한다고 가정 모든. 그래도 DB에 단 하나의 연결이 있어야합니다.
동시에 db 연결 손실을 감지하고 즉시 연결을 시도하려고합니다.
연결 대상을 반환하기 전에 연결 유효성을 검사하는 지연로드 패턴 "getter"를 구현합니다.
코드는 다음과 같을 수 있습니다 :
public class Main {
private DB _db;
public static void main(String[] args) {
new Main().start();
}
private void start() {
// Program code goes here
// You create several threads, some of which may call getDB() whenever they need DB access
}
public DB getDB() {
if (_db == null) {
_db = getDBConnection();
} else if (!_db.isConnectionValid()) {
/*
* DB connection is not valid anymore. Let's close it and
* try to get a new connection.
*/
_db.close();
_db = getDBConnection();
}
return _db;
}
private DB getDBConnection() {
DB db;
// Obtain a new connection...
...
return db;
}
}
문제 :
여러 스레드가 거의 동시에 DB를 연결을 얻기 위해 시도 할 수 있습니다. 일부 클래스가 참조를 유지할 때 여러 연결이 공존 할 수도 있습니다.
이것을 'Semaphore' 클래스와 결합 할 수 있습니까? 그렇게하는 것이 합리적입니까? – riha