Java 为什么需要在ConnectionPool类中同步getConnection方法?
我正在编写一个用于对象实例池的ObjectPool类。在查看internet上现有的代码时,我看到getConnection方法是同步的。我很困惑。为什么我们需要同步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
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
,那么如何实现所需的线程安全性呢?