线程并发-栈限制&ThreadLocal
栈限制(也称线程内部或者线程本地用法)是线程限制的一种特例,在栈限制中,只能通过本地变量才可以触及对象。正如封装使不变约束更容易被保持,本地变量使对象更容易被限制在线程本地中。
本地变量本身就被限制在执行线程中;它们存在于执行线程栈。其他线程无法访问这个栈。
public int loadTheArk(Collection<Animal> candidates) {
SortedSet<Animal> animals;
int numPairs = 0;
Animal candidate = null;
// animals被限制在方法中,不要让它们溢出
animals = new TreeSet<Animal>(new SpeciesGendarComparator());
animals.addAll(candidates);
//
....................
}
ThreadLocal是一种维护线程限制更加规范的方式,它允许将每个线程与持有数值的对象关联在一起。ThreadLocal提供了get和set访问器,为每个使用它的线程维护一份单独的拷贝。
所以get总是返回由当前执行线程通过set设置的最新值。
ThreadLocal变量通常用于防止在基于可变的单体(Singleton)或全局变量的设计中,出现共享。比如说,一个单线程化的应用程序可能会维护一个全局的数据库连接,这个Connection
在启动时就已经被初始化了。这样就可以避免为每个方法都传递一个Connection。因为JDBC规范并未要求Connection自身一定是线程安全的,因此,如果没有额外的协调时,使用全局变量
的多线程应用程序同样不是线程安全的。通过利用ThreadLocal存储JDBC链接,每个线程都会拥有属于自己的Connection。
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>(){
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
};
public static Connection getConnection() {
return connectionHolder.get();
}
浙公网安备 33010602011771号