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