Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在局部变量上同步,优于同步方法?_Java_Multithreading_Thread Safety_Synchronized_Local Variables - Fatal编程技术网

Java 在局部变量上同步,优于同步方法?

Java 在局部变量上同步,优于同步方法?,java,multithreading,thread-safety,synchronized,local-variables,Java,Multithreading,Thread Safety,Synchronized,Local Variables,我围绕数据库查询编写了一个包装器,需要从不同的线程访问它。因此,我的应用程序只创建该helper类的一个实例,并通过getter返回它 DbConnection dbc = app.getDatabaseConnection(); synchronized (dbc) { dbc.doSomething(); } 这个密码安全吗?如前所述,虽然在局部变量上进行同步,但它应该可以工作。只要保证对象实例相同,这是否正确 使所有受影响的DbConnection实例方法同步是一种更好的方法吗?如果

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

DbConnection dbc = app.getDatabaseConnection();
synchronized (dbc) {
  dbc.doSomething();
}
这个密码安全吗?如前所述,虽然在局部变量上进行同步,但它应该可以工作。只要保证对象实例相同,这是否正确


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

如果需要同步所有DbConnection实例方法,请使所有方法同步。不要看你写了多少代码,只看正确性。如果同步每个方法,那么几年后调用getDatabaseConnection然后忘记同步的机会就没有了。

如果需要同步DbConnection的所有实例方法,那么请同步所有方法。不要看你写了多少代码,只看正确性。如果同步每个方法,那么几年后调用getDatabaseConnection然后忘记同步的机会就没有了。

这不是一个好的设计

不必在必要时同步DBConnection类的方法/块,从而使其具有固有的线程安全性,而是强制该类的所有客户端在每次需要时进行显式同步。因此,不要将线程安全性封装在一个单独的、标识良好的类中,而是将此职责分配给该类的所有客户机,使整个过程极为脆弱,潜在的bug极难发现


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

这不是一个好的设计

不必在必要时同步DBConnection类的方法/块,从而使其具有固有的线程安全性,而是强制该类的所有客户端在每次需要时进行显式同步。因此,不要将线程安全性封装在一个单独的、标识良好的类中,而是将此职责分配给该类的所有客户机,使整个过程极为脆弱,潜在的bug极难发现


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

如果可能的话,你应该将
dbc
设置为私有的,更重要的是
final
。如果可能的话,你应该将
dbc
设置为私有的,更重要的是
final
。这是一个锁定的数据库连接,只能有一个连接。我知道同步在这里有缺点,但由于应用程序传输的数据量很小,这应该不是问题。因此,假设底层DB连接是线程安全的(这已经是一个猜测),假设线程a启动一个事务,那么不相关的线程B也尝试启动一个事务。你打算怎么做?为什么不使用连接池,如果真的需要,甚至可以减少到1个连接。这至少可以确保两个线程不会同时使用同一个连接,因为数据库的流量非常小。如果所有事务都由提供同步方法的适配器(DbConnection)执行,那么它不应该工作吗?如果这是一个愚蠢的问题,我很抱歉,但我在过去没有在数据库和线程安全方面做过很多工作。(我也同意,类名有误导性。在一些提交中会改变这一点。)如果整个事务在一个同步方法中完成,它将起作用。如果只是同步getDatabaseConnection(),那么两个线程将无法同时获得连接。但一旦他们都成功地(按顺序)获得它,他们仍然可以同时使用它。如果我使用
synchronized void writemething
synchronized,它应该会起作用。。。readSomething
(假设两者都是DbConnection的实例方法),是吗?这是一个锁定的数据库连接,只能有一个连接。我知道同步在这里有缺点,但由于应用程序传输的数据量很小,这应该不是问题。因此,假设底层DB连接是线程安全的(这已经是一个猜测),假设线程a启动一个事务,那么不相关的线程B也尝试启动一个事务。你打算怎么做?为什么不使用连接池,如果真的需要,甚至可以减少到1个连接。这至少可以确保两个线程不会同时使用同一个连接,因为数据库的流量非常小。如果所有事务都由提供同步方法的适配器(DbConnection)执行,那么它不应该工作吗?如果这是一个愚蠢的问题,我很抱歉,但我在过去没有在数据库和线程安全方面做过很多工作。(我也同意,类名有误导性。在一些提交中会改变这一点。)如果整个事务在一个同步方法中完成,它将起作用。如果只是同步getDatabaseConnection(),那么两个线程将无法同时获得连接。但一旦他们都成功地(按顺序)获得它,他们仍然可以同时使用它。如果我使用
synchronized void writemething
synchronized,它应该会起作用。。。readSomething
(假设两者都是DbConnection的实例方法),不是吗?