【问题标题】:Singleton vs Lock on Database单例与锁定数据库
【发布时间】:2014-05-13 12:07:31
【问题描述】:

我一直使用Singleton 模式和SQLite 创建应用程序,但现在我想知道是否最好使用这样的锁:

class DatabaseHelper {
    Object lock
    SQLiteDatabase db;

    // more properties....

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

}

到目前为止,我一直使用单例,我从不担心查询不执行导致多个连接到同一个数据库的原因,但据我所知,锁也可以解决这个问题。

这里有什么更好的方法,为什么?而且,synchronized 的例子可以吗?我以前从未使用过synchronized,所以我不确定它是否正常。

【问题讨论】:

  • 与安卓无关。请删除android标签。
  • 我相信 Android 更好的方法是使用自定义 ConventProvider 作为 SQLite 的外观,因此框架可以在应用程序中使用此对象手动管理所有生命周期,您也可以从 Fragment 或 @987654330 访问@。请参阅示例here。它也适用于Loaders

标签: java android sqlite synchronized


【解决方案1】:

Singleton 和 Lock 是 2 个不同的概念,并不相互关联。锁定对象级别而不是类级别。对象是单例对象还是普通对象都没有关系。

单例

在软件工程中,单例模式是一种将类的实例化限制为一个对象的设计模式。当需要一个对象来协调整个系统的动作时,这很有用。请注意,单例模式不会对对象应用锁定。例如,2 个不同的线程共享同一个对象引用,并且可以同时对该单个对象调用不同的方法。

锁定

锁定的意思是,我们限制两个不同的线程同时访问同一个资源(对象)。 Java 使用同步块或同步方法实现了锁的概念。

注意:在您的代码示例中,您正在获取“lock”对象的锁定(即 synchronized(lock) ) 但不在“db”对象上。要获取 db 对象的锁定,您必须将代码更改为

synchronized(db){
......
}

【讨论】:

  • 将实例化限制为一个实例,我避免了多个连接到同一个数据库,所以我真正需要的是通过同步块来锁定 db 对象的调用,对吗?
  • (1) 将实例化限制在一个实例上,避免多次连接到同一个数据库-> 不,仍然2个线程可以共享同一个对象的引用,并且可以同时调用它的方法 | (2) 锁定:如果您的应用程序中有多个线程同时访问数据库并对其进行修改,则只需添加同步块或方法。因为这很昂贵,并且会增加 JVM 的开销。
  • 还有一个问题,我不能将我的db 变量设为final,因为它没有在构造函数中初始化。我应该同步方法而不是块吗?
  • 由于这超出了主题,所以请为此提出另一个问题。还请解释你想要做的决赛。您可以使用该接口创建常量变量,如 dbname、path 等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 2011-12-17
相关资源
最近更新 更多