从 WeakHashMap 获取时缓存失效

Cache Invalidation while Getting from WeakHashMap

我通过 WeakHashMap 缓存数据库连接对象,如下所示:

    Connection conn;
    if (connectionCache.get(jdbc.getConnectionURL()) == null) {
        conn = DriverManager.getConnection(jdbc.getConnectionURL(), jdbc.getUsername(), jdbc.getPassword());
        connectionCache.put(jdbc.getConnectionURL(), conn);
    } else {
        conn = connectionCache.get(jdbc.getConnectionURL());
    }

是否可以:

如果语句被检查并看到缓存中已经有一个对象并且在运行 else 语句缓存之前无效?

从技术上讲是这样,但极为罕见。不过解决方法很简单:

如果你想使用 if 中检查的值,它不是 null,你可以直接在 if 中分配它,这样你就不需要在 else 中再次从缓存中检索它:

    Connection conn;
    if ((conn = connectionCache.get(jdbc.getConnectionURL())) == null) {
        conn = DriverManager.getConnection(jdbc.getConnectionURL(), jdbc.getUsername(), jdbc.getPassword());
        connectionCache.put(jdbc.getConnectionURL(), conn);
    }