请问springmvc的controller在单例模式下,如果没有成员变量为什么就是安全的?

blackkami 2015-02-09 11:38:03
如果两个人同时调用一个controller里的a方法,会不会出现错误?

例如第1个人走到方法第5行,b一调用方法,第1个人的方法就回到第1行重新走了?
...全文
587 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jerry_liu20080504 2018-12-17
  • 打赏
  • 举报
回复
springmvc中的controller默认是单例多线程的。每次请求都会生成一条新的线程,多条线程共享单例中的成员变量(如果有的话)。如果成员变量只读,则还是线程安全的。如果可写的,那就需要多条线程之间进行同步处理了。
blackkami 2015-02-09
  • 打赏
  • 举报
回复
引用 3 楼 defonds 的回复:
成员方法也是共享的,为什么就不会出现问题呢? ================================================== 先回答你这个问题: java 里,每个线程都有自己独享的空间,也就是栈内存。线程在调用方法的时候,会创建一个栈帧。也就是说调用一个方法的时候,也就是一个栈帧的入栈过程,该方法执行完毕,栈帧也就出栈了。 换句话讲,成员方法对于每个线程事实上是私有的,而不是你表面看上去的那样是 "共享" 的。 那么为什么成员变量会出问题呢? ================================================== 如你所知道的,每个新建对象都存放在堆中,每个持有该对象引用的线程,都可以访问到它(只要你有那个权限)。 这也就是说,成员变量对于每个线程,事实上是共享的。
这回明白了~谢谢~~原来是引用导致了共享堆中的对象
Defonds 2015-02-09
  • 打赏
  • 举报
回复
成员方法也是共享的,为什么就不会出现问题呢? ================================================== 先回答你这个问题: java 里,每个线程都有自己独享的空间,也就是栈内存。线程在调用方法的时候,会创建一个栈帧。也就是说调用一个方法的时候,也就是一个栈帧的入栈过程,该方法执行完毕,栈帧也就出栈了。 换句话讲,成员方法对于每个线程事实上是私有的,而不是你表面看上去的那样是 "共享" 的。 那么为什么成员变量会出问题呢? ================================================== 如你所知道的,每个新建对象都存放在堆中,每个持有该对象引用的线程,都可以访问到它(只要你有那个权限)。 这也就是说,成员变量对于每个线程,事实上是共享的。
blackkami 2015-02-09
  • 打赏
  • 举报
回复
引用 1 楼 defonds 的回复:
没有状态,也就没有数据安全的问题了
那既然成员变量是共享的属于有状态,成员方法也是共享的,为什么就不会出现问题呢? 我倒是能理解成员方法的参数是私有的无状态的 不知道能不能理解的我的想法。。。。。问的可能有点儿别扭
Defonds 2015-02-09
  • 打赏
  • 举报
回复
没有状态,也就没有数据安全的问题了

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧