繁体   English   中英

Java-如何从多个线程获取或创建连接

[英]Java - How do I get or create a connection from multiple threads

我正在尝试编写代码,以确保我对所有线程都有一个连接对象。 在单调课程中,我有以下成员

MyConnection connection = null; 

并且下面编写的get方法不支持线程。
当不存在或已关闭的连接打开时,它将尝试检索打开的连接。

public Connection getConnection() throws IOException {

    while (connection == null || !connection.isOpen()) {

        MyConnectionInfo connectionInfo = getConnectionInfo();

        ConnectionFactory factory = new ConnectionFactory();
        ...

        connection = factory.newConnection();
    }
    return connection;
}

在这种情况下,我创建了一个连接,在分配连接之前,我可以第二次进入循环。
如何使它线程安全?
有没有比带有同步功能的周围块更好的选择(它会使速度变慢)?
谢谢。

我将使用同步块,然后确保MyConnection是线程安全的。 不要使代码变得比需要的复杂。

尽管同步确实需要时间,但与MyConnection可能要做的相比,这是微不足道的。 我所说的琐碎时间远远少于1/1000。

如果您真的担心性能,请使用多个MyConnection,因为这可能会导致延迟。


假设您的MyConnection通过TCP连接到服务。 该服务需要50毫秒才能响应。 另一方面,如果未优化同步,则同步可能要花费500 ns,即因为您尚未调用足够的代码来使它JIT代码。 这意味着MyConnection花费的时间是100,000倍。 您认为应该在哪里花时间优化? ;)


与说像AtomicInteger.incrementAndGet()这样的增加计数器进行比较。 即使预热了,同步也可能需要100 ns,但加法需要5 ns。 在这种情况下,同步速度要慢20倍,并且可能值得优化,例如使用AtomicInteger(如果已被调用得足够多的话,例如数百万次)。


简而言之,如果您正在执行任何阻塞的IO操作,这将非常慢(并且我的意思是要慢许多个数量级),以至于如果一个锁在代码中保存了一个随机错误,则不会产生很大的不同,特别是。

您不在线程之间共享连接。 假设第一个线程创建单例实例,但是当第二个线程尝试获取连接时,第一个连接可以打开,因此您可以创建新连接。 这打破了单例模式。 由于您正在创建新的连接,因此谁来负责关闭旧的连接。

无论如何,您可以同步整个方法。 由于多个线程正在获取连接,但是连接是稀缺资源,因此这是更好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM