阅读572 返回首页    go 技术社区[云栖]


Java中线程封闭之ThreadLocal

在访问共享数据时通常使用同步。若不使用同步则可以将对象封闭在一个线程中达到线程安全的目的,该方法称为线程封闭(Thread Confinement)。其中实现线程封闭中规范的方法是使用ThreadLocal类。线程封闭技术一种常用的使用场景是在JDBC Connection对象。

public class ConnectionHelper
{
private final static String URL = "";
private final static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>()
{
public Connection initialValue()
{
try
{
return DriverManager.getConnection(URL);
}
catch (SQLException e)
{
throw new RuntimeException("数据库连接有误");
}
}
};

public static Connection getConnection()
{
return connectionHolder.get();
}

}

当初次调用ThreadLocal的get方法时就会调用intialValue来获取初始值,可以理解为Thread<T>包含了Map<Thead,T>对象,但实际实现并不是如此。这些特定于线程的只保存在Thread对象中,当线程终止后会被当做垃圾回收。我曾写过《Java线程范围变量——ThreadLocal的模拟和解释》来模拟ThreadLocal的实现原理,请参看https://blog.csdn.net/woshixuye/article/details/10017871


最后更新:2017-04-03 07:57:12

  上一篇:go mac os x下的一些小技巧
  下一篇:go 【AllJoyn框架-01】连接PC与Arduino Due开发板