以下均在ss3ex环境中
1、理解线程
用户请求一个URL,所触发的一系列操作,均在一个线程中。即一个servlet中执行的操作均在一个线程中。
//actionA调用serviceA方法
actionA(){
serviceA();
}
//actionB调用serviceB方法
actionB(){
serviceB();
}
//serviceA调用A、B、C等方法
serviceA(){
A();
B();
C();
D();
……
}
//serviceB调用AA、BB、CC等方法
serviceB(){
AA();
BB();
CC();
DD();
……
}
Struts2中的action方法就是一个servlet方法,servlet是线程安全的,即多用户访问时会创建多个线程。以上actionA方法,调用的所有方法均在一个线程中;以上actionB方法,调用的所有方法也均在一个线程中。
用户请求2个URL,所触发的一系列操作,即2个servlet中执行的操作不能保证在一个线程中。
某个用户请求actionA方法,然后请求actionB方法,那么actionA和serviceA方法与actionB和serviceB方法就有可能不在一个线程中,而在2个不同的线程中执行。
2、线程内传值
线程内即上述第一种情况,线程内传值前提条件是同步方法的的传值,所谓同步就是执行完了B,再执行C方法,D方法。即在serviceA方法中的A方法中,创建一个ThreadLocal变量,即可以实现该变量在后续的B、C、D方法共享。
3、线程间传值
线程间传值即在不同的线程中共享传值,列举3种解决方案。
第一种:当用户请求actionA方法时set值到request中,然后跳转到页面,在页面提交form表单时,actionB获得request中的值。
第二种:结合ThreadLocal和request(或者session)一起使用,当用户请求serviceA方法中的A方法时,创建一个ThreadLocal变量(此时B、C、D方法中均能共享使用),接着set值到request(或者session)中,然后跳转到页面,在页面提交form表单时,actionB获得request(或者session)中的值,在serviceB中的BB方法中先获取ThreadLocal中的值,如果没有就把request(或者session)中的值set进ThreadLocal中,这样BB、CC、DD方法中就能享用这个值了。
第三种:采用spring security中的权限传值,spring security中每个用户的权限都放置在类似session这样的变量中,那么,我就可以把actionA中的值放置在spring security中权限区域中,这样后续的这个用户的所有操作方法均能享用这个值。
总结:结合项目的实际情况,如果项目采用spring security搭建权限,那么推荐用第三种方式,否则推荐第二种。
备注:有人问为什么不用session来传值,因为session只能解决前台的传值,后台的方法中的传值比较麻烦。
分享到:
相关推荐
java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...
它是一种特殊类型的变量,每个线程都有自己的副本,互不影响,从而实现线程间数据隔离。ThreadLocal通常被用来解决线程共享数据时可能出现的并发问题,避免了使用synchronized关键字进行同步控制的复杂性。 在Java...
本例以序列号生成的程序为例,展示ThreadLocal的使用
总结来说,Java线程编程中的ThreadLocal类提供了一种高效、便捷的方式来实现线程间的隔离数据,但同时也需要开发者注意其潜在的内存泄漏风险。正确理解和使用ThreadLocal,能够帮助我们编写出更加健壮、高效的并发...
假设我们需要一个线程安全的计数器,可以使用ThreadLocal实现: ```java public class ThreadLocalCounter { private static ThreadLocal<Integer> counter = new ThreadLocal(); public static void increment...
ThreadLocal是一种线程局部变量,它为每个线程都创建了一个独立的变量副本,从而避免了线程间的资源共享,减少了并发问题。每个线程都有自己的ThreadLocal变量,它们之间互不影响。ThreadLocal通常用于存储线程私有...
在Java中,有多种方式可以实现线程间的数据共享和对象独立,其中ThreadLocal是常用的工具之一。 在多线程环境下,共享数据通常会引发线程安全问题,比如上述例子中的“张三给李四转钱”场景,如果两个线程同时操作...
总结,`ThreadLocal`是Java中用于实现线程局部变量的工具,它提供了一种简单的方式在多线程环境下隔离数据,避免了传统的同步机制。但是,使用时需注意其潜在的内存泄漏风险和对代码可读性的影响,合理地选择使用...
以上是对ThreadLocal的简单介绍和源码分析,实际使用中还需要结合具体业务场景进行合理设计和优化。通过深入理解ThreadLocal的工作原理,可以帮助我们更好地利用这一工具,提高代码的并发性能和可维护性。
然而,这些同步机制并不总是最优解,特别是在需要线程内共享变量且避免线程间干扰的情况下。此时,`ThreadLocal`就派上了用场。 **ThreadLocal** 是Java提供的一个工具类,用于在**线程作用域内**创建和管理独立的...
ThreadLocal主要用于解决线程间的数据隔离问题,确保各线程拥有自己的变量副本,避免了数据共享带来的并发问题。在Web应用中,特别是对于"session"数据的管理,ThreadLocal可以作为一种有效的解决方案。 1. **什么...
**标题:“JDK的ThreadLocal理解(一)使用...通过以上分析,我们可以看到ThreadLocal在实现线程间数据隔离、简化多线程编程方面的作用。然而,使用时也要注意避免内存泄漏和过度依赖,合理规划其在系统架构中的位置。
6. **线程通信**:`WaitHandle`(如`AutoResetEvent`, `ManualResetEvent`, `CountdownEvent`)用于线程间的通信和同步,可以用来控制线程的执行顺序或作为线程间信号。 7. **线程状态管理**:`Thread`对象提供了多种...
ThreadLocal是Java编程中一种非常特殊的变量类型,它主要用于在多线程环境下为每个线程提供独立的变量副本,从而避免了线程间的数据共享和冲突。然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将...
在具体实践中,开发者需要根据业务场景合理选择事务管理方式和ThreadLocal的使用,以保证系统的性能和数据一致性。例如,在分布式服务中,可能会使用分布式事务解决方案如两阶段提交(2PC)、补偿事务(TCC)等,而...
Java中,我们可以通过`java.lang.ThreadLocal`类来实现线程局部变量。`ThreadLocal`提供了一个线程局部存储的方法,每个线程都有一个与之关联的`ThreadLocal`实例,可以独立地设置和获取值。下面是一个简单的使用...
在Spring事务管理中,连接池与ThreadLocal结合,确保每个线程在事务内使用的是同一连接,避免了事务间的干扰。例如,`HikariCP`和`C3P0`等流行的连接池实现都支持与Spring事务管理的无缝集成。 在实际应用中,理解...