Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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-如何从多个线程获取或创建连接_Java_Multithreading_Connection - Fatal编程技术网

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

Java-如何从多个线程获取或创建连接,java,multithreading,connection,Java,Multithreading,Connection,我正在尝试编写一个代码,以确保我有一个单一的连接对象到所有线程。 在单音类中,我有以下成员 MyConnection connection = null; 下面编写的get方法不支持线程。 当不存在打开的连接或连接已关闭时,它会尝试检索打开的连接 public Connection getConnection() throws IOException { while (connection == null || !connection.isOpen()) { My

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

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可能做的事情相比,它是微不足道的。我所说的琐碎是指远远少于千分之一的时间

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


假设您的MyConnection通过TCP连接到服务。此服务需要50毫秒才能响应。另一方面,如果未对同步进行优化,则同步可能需要500 ns,也就是说,因为您没有调用足够的代码来JIT代码。这意味着MyConnection需要花费100000倍的时间。你认为你应该把时间花在哪里进行优化


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


简而言之,如果您正在执行任何阻塞IO操作,这将非常缓慢(我的意思是要慢很多个数量级),一个锁不会有太大的影响,特别是如果它在代码中为您节省了一个随机错误。

synchronized
并不慢。不再是了。在1.x天内,您可能会使用a来序列化对连接的访问。