线程并发-栈限制&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();
}

  

  

posted @ 2011-09-15 17:54  k3huihui  阅读(931)  评论(0)    收藏  举报