0

我围绕数据库查询编写了一个包装器,需要从不同的线程访问它。因此,我的应用程序只创建了该助手类的一个实例,并通过 getter 将其返回。

DbConnection dbc = app.getDatabaseConnection();
synchronized (dbc) {
  dbc.doSomething();
}

这段代码安全吗?如此处所述尽管在局部变量上同步,但它应该可以工作。只要保证对象实例相同,这是否正确?

使所有受影响的 DbConnection 实例方法同步是一种更好的方法吗?

4

2 回答 2

3

这不是好的设计。

不是通过在必要时同步其方法/块来使您的 DBConnection 类本质上是线程安全的,而是强制此类的所有客户端在每次需要时显式地同步。因此,不是将线程安全性封装在一个明确的类中,而是将此责任分配给该类的所有客户端,这使得整个事情变得非常脆弱,并且潜在的错误非常难以发现。

也就是说,使用来自多个线程的单个数据库连接本身就是一个坏主意。

于 2013-11-01T17:07:34.303 回答
1

如果您的 DbConnection 的所有实例方法都需要同步,则使所有方法同步。不要看你写的代码量,只看正确性。如果您同步每个方法,您就没有机会从现在回到几年后调用 getDatabaseConnection 然后忘记同步。

于 2013-11-01T17:07:21.740 回答