Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 为什么需要在ConnectionPool类中同步getConnection方法?_Java_Multithreading_Synchronization - Fatal编程技术网

Java 为什么需要在ConnectionPool类中同步getConnection方法?

Java 为什么需要在ConnectionPool类中同步getConnection方法?,java,multithreading,synchronization,Java,Multithreading,Synchronization,我正在编写一个用于对象实例池的ObjectPool类。在查看internet上现有的代码时,我看到getConnection方法是同步的。我很困惑。为什么我们需要同步getConnection方法? 下面是代码示例 public synchronized Connection getConnection() { Connection con = null; if (freeConnections.size() > 0) { // P

我正在编写一个用于对象实例池的ObjectPool类。在查看internet上现有的代码时,我看到getConnection方法是同步的。我很困惑。为什么我们需要同步getConnection方法? 下面是代码示例

 public synchronized Connection getConnection() {
        Connection con = null;
        if (freeConnections.size() > 0) {
            // Pick the first Connection in the Vector
            // to get round-robin usage
            con = (Connection) freeConnections.firstElement();
            freeConnections.removeElementAt(0);
            try {
                if (con.isClosed()) {
                    log("Removed bad connection from " + name);
                    // Try again recursively
                    con = getConnection();
                }
            }
            catch (SQLException e) {
                log("Removed bad connection from " + name);
                // Try again recursively
                con = getConnection();
            }
        }
        else if (maxConn == 0 || checkedOut < maxConn) {
            con = newConnection();
        }
        if (con != null) {
            checkedOut++;
        }
        return con;
    }
公共同步连接getConnection(){
连接con=null;
如果(freeConnections.size()>0){
//拾取向量中的第一个连接
//获得循环使用
con=(Connection)freeConnections.firstElement();
freeConnections.removeElementAt(0);
试一试{
if(con.isClosed()){
日志(“已从“+名称”中删除坏连接);
//再试一次
con=getConnection();
}
}
捕获(SQLE异常){
日志(“已从“+名称”中删除坏连接);
//再试一次
con=getConnection();
}
}
else if(maxConn==0 | | checkedOut

我的意思是,对于每个线程,我们将创建一个新的ConnectionManager实例,该实例将从ConnectionPool获取连接。为什么我们需要ConnectionPool类中的同步方法?请解释一下。我很困惑。

因此需要同步多个线程的操作,并确保在给定时间点只有一个线程可以访问资源

因此需要同步多个线程的操作,并确保在给定时间点只有一个线程可以访问资源

    if (freeConnections.size() > 0) {                      // A
        // Pick the first Connection in the Vector
        // to get round-robin usage
        con = (Connection) freeConnections.firstElement(); // B
        freeConnections.removeElementAt(0);                // C
想象一下,如果两个线程按以下顺序运行此代码:A1、A2、B1、B2、C1、C2。它们都将获得与进程相同的连接(第一个),然后第二个线程将删除它们都没有使用的第二个连接(第二个)


想象一下,如果两个线程按以下顺序运行此代码:A1、A2、B1、B2、C1、C2。它们都将获得与进程相同的连接(第一个),然后第二个线程将删除它们都没有使用的第二个连接(第二个)

由于getConnection方法被设计为与单个数据源实例并发调用。因此它确保了数据源的线程安全。而且JDBC本身不提供线程安全。线程安全是指在特定时间将资源分配给单个线程,在该线程使用资源时,没有人可以访问它线程。此行为可防止脏读/写。但是,同步化可以在类级别进行通用化,而不需要是本地的。此外,如果在构造函数/初始值设定项方法中使用getConnection,则可以在需要时在程序中调用它,前提是每次都正确关闭它。在这种情况下,您不需要显式同步序列化。

因为getConnection方法被设计为与单个数据源实例并发调用。因此它确保了数据源的线程安全。而且JDBC不提供线程安全。线程安全是指在特定时间将资源分配给单个线程,并且没有人可以在它由该线程使用。此行为可防止脏读/写。但是,同步可以在类级别上通用化,不需要是本地的。此外,如果在构造函数/初始值设定项方法中使用getConnection,则可以在程序中随时调用它,只要每次都正确关闭它。在这种情况下,您不需要显式的序列化。

从JAVA连接到数据库有不同的策略。主要是为了线程安全,您需要在ConnectionPool类中同步getConnection。如果程序中有多个线程,则可能有多个线程同时调用getConnection。在这种情况下,除非使其同步,否则无法确保线程安全

一旦您使用synchronized关键字,它将确保单个线程将访问您的getConnection,从而使其成为线程安全的事务


尽管java文档中没有明确提到,但DataSource#getConnection方法被设计为在单个DataSource实例上并发调用。

从java连接到数据库有不同的策略。主要是为了线程安全,您需要在ConnectionPool类中同步getConnection。如果程序中有多个线程,则可能有多个线程同时调用getConnection。在这种情况下,除非使其同步,否则无法确保线程安全

一旦您使用synchronized关键字,它将确保单个线程将访问您的getConnection,从而使其成为线程安全的事务


虽然java文档中没有明确提到,但DataSource#getConnection方法被设计为在单个DataSource实例上并发调用。

好吧,假设它没有同步。。。如果有一个连接可用,而两个线程同时调用
getConnection
,那么如何实现所需的线程安全性?假设它没有同步。。。如果有一个连接可用,而两个线程同时调用
getConnection
,那么如何实现所需的线程安全性呢?