之前的两篇文章已经基本上将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,会占用更多的内存,这样是空间换时间的必然结果。