手机钢化膜是全屏钢化膜的好,还是非全屏钢化膜的好用

SpringMVC中创建新线程引起的Null错误 - kanpiaoxue - ITeye技术网站
博客分类:
今天在一个现有的SpringMVC的Web程序中添加新功能,引起了NullPoint的错误。看了代码,找到了错误的发生点,怎么看,代码都是正确的。不知道为啥?
起因是这样的:
我在SpringMVC中添加到了controller,然后写了service类。里面涉及了同事的dao类。在service类中的一个查询方法中,调用了2个dao中的查询数据的方法。因为数据量大,为了加快程序的运行速度,提高程序的运行效率,我在servcie的这个查询方法中对这个2个dao的查询分别写了Callable 接口的并行查询操作。写好之后,发现了上面说的空指针的错误。当我把它们修改为线性的单线程查询的时候(一个查询方法执行完毕,再去执行另一个查询方法),发现没有空指针的错误。百思不得其解。我查看了同事的dao类,发现这个null的空指针错误就是代码里面调用了spring security的一个用户权限检查的方法引起的。我又再次尝试单线程调用,是没有问题,采用多线程调用就有问题。(我在servcie类里面用ExecutorService exec = Executors.newCachedThreadPool(); 生成的新的线程池)。想了想,明白了。同事的dao类,调用spring security的权限检查,里面的spring应该是把当前运行的线程(tomcat产生的线程) 和一个用户的权限绑定了在一起,采用ThreadLocal。我利用自己的线程,造成ThreadLocal找不到新线程的用户组绑定内容,出现了空指针。
解决方案:
我调用同事的dao类的2个查询方法,一个涉及到spring security,一个没有涉及到spring security。我把没有涉及到spring security的查询方法放在自己创建的线程池中调用,涉及到security的方法,保留在原有线程中(tomcat生成的线程),这样,即取到了并发查询的效果,也没有干涉到spring security 的本地线程变量绑定。
思考:使用spring的时候,需要注意,尤其多线程的情况下,改变了当前线程环境的情况下,需要考虑spring的线程环境是否发生了改变。
修改后的代码:
public String initQueryCondition(final Integer gameId) {
Map&String, Object& dataMap = new HashMap&String, Object&();
// 开始并行查询
ExecutorService exec = Executors.newCachedThreadPool();
Future&List&GameServerBean&& f1 = exec
.submit(new Callable&List&GameServerBean&&() {
public List&GameServerBean& call() throws Exception {
return gameServerDao.selectAll(gameId);
exec.shutdown();
* 这里没有用并行查询,因为这个查询里面涉及了ThreadLocal(由spring的security使用),
* 启动新的线程会造成线程环境改变,发生null的错误
List&GameProviderBean& providerList = gameProviderDao
.selectAll(gameId);
List&GameServerBean& serverList = f1.get();
dataMap.put("serverLsit", serverList);
dataMap.put("providerList", providerList);
return createJson(dataMap);
} catch (Exception e) {
LOGGER.error("Error:" + e.getMessage(), e);
kanpiaoxue
浏览: 456404 次
来自: 北京
理解错了,原来还是计数,不是时间
TimeoutTerminationPolicy 是毫秒 默认 ...
实在没有理解你说的是什么意思。我的这个rar里面有这个包呀。如 ...
你的工程中有jetty-all-9.2.2.v ...Spring 并发访问的线程安全性问题 - 推酷
Spring 并发访问的线程安全性问题
首先对于Spring的IOC来说,对象是由Spring来帮我们管理,也就是在Spring启动的时候,在Spring容器中,由Spring给我们创建的,Spring会帮我们维护,一般都是单例的,也就是一个对象。
spring生成对象默认是单例的。通过scope属性可以更改为多例。
第一部分:验证Spring生成对象默认是单例的。
下面我们来一个网上的例子验证一下:
&bean id=&singleton& class=&java.util.Date& scope=&singleton&&&/bean& &
&bean id=&prototype& class=&java.util.Date& scope=&prototype&&&/bean& &
import java.util.D &
import org.springframework.context.ApplicationC &
import org.springframework.context.support.ClassPathXmlApplicationC &
import com.opensymphony.xwork2.ActionC &
public class TestScope { &
& &public static void main(String[] args) { &
& & & ApplicationContext context=new ClassPathXmlApplicationContext(&applicationContext-web.xml&); &
& & & Date s1=(Date)context.getBean(&singleton&); &
& & & Date p1=(Date)context.getBean(&prototype&); &
& & & Date s2=(Date)context.getBean(&singleton&); &
& & & Date p2=(Date)context.getBean(&prototype&); &
& & & System.out.println(&单例:&+(s1==s2)); &
& & & System.out.println(&非单例:&+(p1==p2)); &
单例:true
非单例:false
注:复合数据类型的“== ”对比的是内存中存放的地址,所以此处我们采用“==”去对比
因为object中的equals初始行为是比较内存中的地址,但在一些类库中被覆盖掉了如(String,Integer,Date等)
第二部分:
SpringMVC和Struts2中是并发访问否会存在线程安全问题。
对于使用过SpringMVC和Struts2的人来说,大家都知道SpringMVC是基于方法的拦截,而Struts2是基于类的拦截。
对于Struts2来说,因为每次处理一个请求,struts就会实例化一个对象;这样就不会有线程安全的问题了
而Spring的controller默认是Singleton的,这意味着每一个request过来,系统都会用原有的instance去处理,这样导致两个结果:
一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。
当然大多数情况下,我们根本不需要考虑线程安全的问题,比如dao,service等,除非在bean中声明了实例变量。因此,我们在使用spring mvc 的contrller时,应避免在controller中定义实例变量。
public class Controller extends AbstractCommandController { & &
& &protected C &
& &protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object command,BindException errors) throws Exception { &
& & & &company = ................; & & & & &
& & } & & & & & &
解决方案:
有几种解决方法:
1、在Controller中使用ThreadLocal变量
2、在spring配置文件Controller中声明 scope=&prototype&,每次都创建新的controller
所在在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的。
@Controller &
@RequestMapping(&/fui&) &
public class FuiController extends SpringController { &
//这么定义的话就是单例 &
@Controller &
@Scope(&prototype&) &
@RequestMapping(&/fui&) &
public class FuiController extends SpringController { &
//每次都创建 &
第三部分:
springMVC与struts2的区别
下面是从网络上摘抄的一段对比,大家可以看看
1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。
3. 参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
4. 设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。
intercepter的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring
6. 另外,spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。
这样也说明了SpringMVC还有Servlet都是方法的线程安全,所以在类方法声明的私有或者公有变量不是线程安全的,而struts2的确实是线程安全的。
第四部分:
那么对于Struts2+Spring来管理注入的时候呢?
Struts2它是多实例的,对于每个请求都会生成1个实例,spring默认是单实例的(下面针对Struts与Spring集成的两种方式分别来介绍
一:对于无Spring插件(Struts2-spring-plugin-XXX.jar)的整合方式,需要在spring的action Bean中加业务逻辑控制器类配scope=&prototype&。
&bean id=&user& class=&modle.User& scope=&prototype&&&/bean& &
二:对于有Spring插件(Struts2-spring-plugin-XXX.jar)的整合方式:反编译
如果是spring配置文件中的 bean的名字的话就是spring创建,那么单实例还是多实例就由spring的action
Bean中的业务逻辑控制器类是否配置为scope=”prototype”,有就是多实例的,没有就是单实例的,顺序是先从spring中找,找不到再
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 全屏蓝光钢化膜好不好 的文章

 

随机推荐