我编写了一个围绕数据库查询的包装器,需要从不同的线程访问它。因此,我的应用程序只创建该助手类的一个实例,并通过getter返回它。
DbConnection dbc = app.getDatabaseConnection();
synchronized (dbc) {
dbc.doSomething();
}
这段代码安全吗?如上所述,here虽然在局部变量上进行同步,但它应该可以工作。只要对象实例保证相同,这是正确的吗?
使DbConnection的所有受影响的实例方法同步是一种更好的方法吗?
答案 0 :(得分:3)
这不是好设计。
不是通过在必要时使其方法/块同步来使DBConnection类本身具有线程安全性,而是强制此类的所有客户端在每次需要时都明确地同步。因此,不是将线程安全性封装在一个明确的类中,而是在类的所有客户端中分配这个责任,使整个事情变得非常脆弱,并且很难找到潜在的错误。
也就是说,使用来自多个线程的单个数据库连接本身就是一个坏主意。
答案 1 :(得分:1)
如果需要同步DbConnection的所有实例方法,则使所有方法同步。不要看你写的代码量,只看正确性。如果你同步每个方法,你就没有机会从现在起几年后再调用getDatabaseConnection然后忘记同步。