在使用Fortify 扫描代码之后报出如下警告, J2EE Bad Practices:Threads (FORTIFY.J2EE_Bad_Practices--Threads) 0. InCall: Threadlocal()。经查资料主要是J2EE的规范,就是在某些情况下禁止web使用线程管理器,以免造成死锁等问题。

       事实上Threadlocal应该是不会出现死锁这种现象的,所以关于扫描的代码警告可以忽略。那么到底Threadlocal是干嘛用的呢?ThreadLocal类用来提供线程内部的局部变量。这些变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都是private static类型。 总结:ThreadLocal不是为了解决多线程访问共享变量,而是为每个线程创建一个单独的变量副本,提供了保持对象的方法和避免参数传递的复杂性。

        ThreadLocal的主要应用场景为按线程多实例(每个线程对应一个实例)的对象的访问,并且这个对象很多地方都要用到。例如:同一个网站登录用户,每个用户服务器会为其开一个线程,每个线程中创建一个ThreadLocal,里面存用户基本信息等,在很多页面跳转时,会显示用户信息或者得到用户的一些信息等频繁操作,这样多线程之间并没有联系而且当前线程也可以及时获取想要的数据。

        ThreadLocal与synchronized的区别是什么呢?ThreadLocal通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题,而synchronized主要是多个线程同时访问同一个共享变量时只能有一个线程可以访问该变量。从另一个角度来看, ThreadLocal就是通过空间换时间,而synchronized则是时间换空间。

更多推荐

Threadlocal之关于Fortify 扫描警告