多线程总结——尾篇

之前的两篇文章已经基本上将Java多线程中Thread类的各项操作和两个重点的关键字总结了。这篇主要对一些Java多线程拓展的内容进行总结。


ThreadLocal

ThreadLocal类是在JDK1.2中出现的一个多线程的辅助类。它为我们解决多线程问题提供了一个新的思路。

在以往的问题中,我们解决多线程安全问题在很多时候都会使用同步技术,但不可避免的会产生效率低下,阻塞严重的情况。其根本原因在于对共享变量进行操作时,只能够由单一线程进行。而ThreadLoacl则提供了一种新的思路,类似于算法中的牺牲空间,换取时间。

ThreadLocal会将共享变量的副本存贮与每个调用的线程中,线程在内部访问该变量,相互之间不受影响。就类似Java静态变量和成员变量的关系。

用一个数据库连接例子来说。

public class Mode{
	 
	 private static Connection connection = null;
	 
	 public static Connection getConnection(String url) throws SQLException {
		 
		 if(connection == null) connection = DriverManager.getConnection(url);
		 
		 return connection;
	 }
	 
	 public static void closeConnection() throws SQLException {
		 if(connection != null) connection.close();
	 }
}

这是一个获取数据库连接的类,在单线程中,没有任何问题。而在多线程中,会发生线程安全问题。可能在同一时间会创建多个connection,也可能在一个线程正在使用链接的情况下,另一个线程关闭了连接。如果通过同步锁方式去处理代码块,我们的确能够解决这个问题,但是会造成非常低下的性能。

这时我们可以使用ThreadLoacal,为每个线程都创造一个改变量的副本,彼此之间相互独立。这样能够保证变量修改不会影响到其他线程的安全。但代价就是会出现多个connection,会占用更多的内存,这样是空间换时间的必然结果。


猜你喜欢

转载自blog.csdn.net/weixin_41582192/article/details/81779520