Guest User

Untitled

a guest
May 23rd, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.01 KB | None | 0 0
  1. Question:这个问题的缘起是spring mvc默认是单例的,所以我产生了这样一个疑问?在高并发下,是单例模式效率高还是多例模式效率高?之所以有这个疑问是因为我认为单例模式下,当一个请求在处理中的时候,接下来的请求会处于等待中(小白,大家勿笑)。之后有大神告诉我不会阻塞,因为web容器是多线程的。当时我觉得自己理解了。但之后我就咂摸这句话,是因为多线程所以不会阻塞。为什么多线程就不会阻塞呢?为什么多个线程操作同一个对象的同一个方法就不会阻塞呢?为什么多线程执行同一个对象的同一个方法中的相同代码不会阻塞呢?求教各位大神。
  2.  
  3. Answer1:方法 存在JVM的一个内存区,这个方法区被各个线程共享。
  4. 打个不恰当的比方,如下:
  5. 老师在黑板上面写了一条1+1=?,同学们 同时看到信息后开始拿起笔计算。这里的黑板就相当于内存区,1+1=? 指令相当于方法,同学们相当于线程,大家一起并行计算,并没有阻塞。
  6. 那什么时候有阻塞?
  7. 老师说,谁要解答,请上讲台上来,这个时候可能会出现阻塞。
  8.  
  9. Answer2:感觉你说的问题,是两个问题,当多个请求发生的时候,采用多线程的模式,每一个线程处理一个或者多个请求,才能及时响应用户的请求。这个时候,每一个线程,都会访问 app 的这个实例的同一段代码,这段代码如果访问阻塞需要等待的资源,线程就可能阻塞,无论是单例,还是多例,都是一样的。
  10.  
  11. 设计上用单例就能必然阻塞,多例就不会阻塞?不是的,线程阻塞是因为资源需要等待,不是因为这个关系。如果内存都是读的关系,就不存在竞争,如果内存的变化都是各自一份,也没有竞争(函数式编程)。
  12.  
  13. 单例是一种设计模式,是为了软件容易维护,容易复用,容易测试才出现的,和阻塞不阻塞没因果联系。
Add Comment
Please, Sign In to add comment