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来序列化对连接的访问。