微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么jdbc DriverManager getConnection() 需要synchronized(DriverManager.class)? Java 8 片段:Java 11 片段

如何解决为什么jdbc DriverManager getConnection() 需要synchronized(DriverManager.class)? Java 8 片段:Java 11 片段

Unresolved reference

我看不懂评论,什么时候不会加载正确的类加载器?

解决方法

它似乎没有用,这个 synchronized 块在后来的 Java 版本中被删除了。它存在于 Java 8 更新 275 中,但不存在于 Java 11.0.9 中(我猜它在 Java 9 中已被删除)。

对我来说,它看起来像是初始化字段而不是局部变量的代码的剩余部分,或者它可能用于解决其他并发问题。在 Java 8 中,许多(静态)DriverManager 方法(registerDriverderegisterDriver)被定义为 sychronized,因此这可能用于建立一个发生之前这些方法与 getConnection 方法之间的关系。但是,由于驱动程序注册存储在 CopyOnWriteArrayList 中,因此没有必要建立这种发生在之前的关系;然而,在较旧的 Java 版本中,这可能是一个普通的 ArrayList,因此它可能需要发生之前。

但是,我不想在旧的 Java 版本上进行代码考古来证实这些理论中的任何一个。

所以,简而言之:它是不必要的,并且在以后的 Java 版本中被删除了。

Java 8 片段:

//  Worker method called by the public getConnection() methods.
private static Connection getConnection(
    String url,java.util.Properties info,Class<?> caller) throws SQLException {
    /*
     * When callerCl is null,we should check the application's
     * (which is invoking this class indirectly)
     * classloader,so that the JDBC driver class outside rt.jar
     * can be loaded from here.
     */
    ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;
    synchronized(DriverManager.class) {
        // synchronize loading of the correct classloader.
        if (callerCL == null) {
            callerCL = Thread.currentThread().getContextClassLoader();
        }
    }

    if(url == null) {
        throw new SQLException("The url cannot be null","08001");
    }

Java 11 片段

//  Worker method called by the public getConnection() methods.
private static Connection getConnection(
    String url,so that the JDBC driver class outside rt.jar
     * can be loaded from here.
     */
    ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;
    if (callerCL == null || callerCL == ClassLoader.getPlatformClassLoader()) {
        callerCL = Thread.currentThread().getContextClassLoader();
    }

    if (url == null) {
        throw new SQLException("The url cannot be null","08001");
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。