2014-05-13 2 views
0

에 잠금 대 난 항상 SQLiteSingleton 패턴 생성 응용 프로그램을 사용했지만, 지금은 궁금해은 다음과 같이 잠금을 사용하는 것이 가장 좋은 것입니다 경우 : 지금까지 내가 항상 싱글 톤을 사용했기 때문에싱글은 데이터베이스

class DatabaseHelper { 
    Object lock 
    SQLiteDatabase db; 

    // more properties.... 

    public void insert(BusinessEntity entity) { 
     synchronized(lock) { 
      db.insert(BusinessEntity.TABLE_NAME, // more params... 
     } 
    } 

} 

, 나는 동일한 DB에 대한 다중 연결의 원인을 실행하지 않는 질의에 대해 결코 걱정하지 않는다. 그러나 내가 이해할 수있는 것처럼, 잠금은 이것을 해결할 것이다.

더 나은 접근 방법은 무엇이며 그 이유는 무엇입니까? 그리고 또한, synchronized 예제가 괜찮습니까? 나는 결코 전에 synchronized를 사용하지 않았다 그래서 나는 그것이 좋다는 것을 확실하지 않다.

+0

으로 변경해야합니다. 안드로이드 관련 없음. 안드로이드 태그를 제거하십시오. –

+0

필자는 안드로이드에 대한 더 나은 접근 방식 인'ConventProvider'를 SQLite의 외관으로 사용한다고 믿고 있습니다. 프레임 워크는이 객체를 사용하여 응용 프로그램 내에서 모든 라이프 사이클을 수동으로 관리 할 수 ​​있으며'Fragment' 또는'Activity'에서도 액세스 할 수 있습니다. 예제 [here] (http://developer.android.com/guide/topics/providers/content-provider-creating.html)를 참조하십시오. 또한 그것은 [로더] (http://developer.android.com/guide/components/loaders.html)와 완벽하게 작동합니다. – aim

답변

0

싱글 톤과 잠금은 서로 다른 개념으로 서로 관련이 없습니다. 잠금은 오브젝트 레벨에서는 획득하지만 클래스 레벨에서는 획득하지 않습니다. 그 객체가 싱글 톤 객체인지 일반 객체인지는 중요하지 않습니다.

싱글 소프트웨어 공학

는, 단독 패턴은 객체 클래스의 인스턴스화를 제한하는 설계 패턴이다. 이는 시스템 전체에서 작업을 조정하는 데 정확히 하나의 객체가 필요한 경우에 유용합니다. 싱글 톤 패턴은 객체에 잠금을 적용하지 않습니다. 예를 들어, 2 개의 다른 thread가 같은 단일의 객체 참조를 공유하고있어 그 단일의 객체로 다른 메소드를 동시에 호출 할 수가 있습니다.

잠금

잠금 수단은, 우리는 동시에 2 개의 다른 스레드가 동일한 자원 (객체)에 액세스하도록 제한된다. Java는 동기화 된 블록 또는 동기화 된 메소드를 사용하여 잠금 개념을 구현했습니다.

참고 : 코드 예제에서는이 아니라 "DB"개체에 을 "잠금"개체 (즉, 동기 (잠금))에 대한 잠금을 획득하고 있습니다. db 객체에 대한 잠금을 획득하려면 코드를

synchronized(db){ 
...... 
} 
+0

인스턴스화를 한 인스턴스로 제한하여 동일한 데이터베이스에 대한 다중 연결을 피하기 때문에 실제로 필요한 것은 블록을 동기화하여 db 객체에 대한 호출을 잠그는 것입니다. 맞습니까? –

+0

(1) 인스턴스화를 한 인스턴스로 제한하여 동일한 데이터베이스에 대한 다중 연결을 방지합니다. -> 아니요, 여전히 2 개의 스레드가 동일한 객체 참조를 공유 할 수 있으며 동시에 해당 메소드를 호출 할 수 있습니다. (2) 잠금 : 데이터베이스에 동시에 액세스하는 스레드가 여러 개 있고 수정하는 경우 동기화 된 블록이나 메서드 만 추가하십시오. 이는 비용이 많이 들고 JVM에 오버 헤드를 추가하기 때문입니다. –

+0

감사합니다. –