1.什么是线程安全问题?
当服务器同时接收多个访问的时候,服务器会为每个请求分配一个线程。而这多个线程如果调用了同一个方法,并且这个方法有全局变量,而这个方法也进行了写操作,将变量的值改变了。这个时候就会出现线程安全问题。请求会和想要的结果不一样,甚至会出现系统运行期报错。比如,对一个集合进行了循环,并更改了他的值,而这个时候因一个线程也进行遍历改变他的值也许就会出现运行时期异常。
2.解决办法。有两个
第一个办法:线程锁。 线程锁是说当多个线程同时访问一个方法的时候,就判断另一个线程有没有走完这个方法。如果其他的线程没有走完,这些线程只能排除等待。只有当一个线程走完的时候,另一个线程才可能运行。
第二个办法。threadlocal 本地线程。 将实例对象添加到threadlocal中,用的时候在threadlocal中获取
3.spring中线程安全问题。
springmvc中在创建controler的时候默认都是单例的,因为springmvc是基于方法的 展现层框架,当请求提交参数的时候会直接将变量添加到方法的成员变量中,所以只要不定义成员变量就不会出现线程安全问题。 当然一但定义了实例对象(成员变量)并进行了写操作就会出现线程安全问题。
spring在创建bean对象的时候默认认都是单例的,都会存在线程安全问题。应该注意。
4.strus中线程安全问题
使用struts的时候一般都会和spring一起使用,让spring来创建struts的action对象,而strusts在接收请求参数的时候,会用到成员变量,所有如果将action一但创建成单例的时候就会出现线程安全问题。所有在struts的时候一般都是会多例的。每一次请求都会创建一个action.
时间: 2024-12-20 18:18:31