spring为什么是线程安全的

 我来答
三过其门儿不入
推荐于2018-03-13 · TA获得超过334个赞
知道小有建树答主
回答量:266
采纳率:87%
帮助的人:144万
展开全部

Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式。

单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法)。




public class PersonController{    
    private PersonService personService;    
     
    public void setFirstName(HttpServletRequest request){                    
        personService.setFirstName(request.getParameter("firstname"));    
    }    
     
    public String getFirstName(){             
        return   personService.getFirstName();    
    }
                  
}

当有两个线程访问PersonController时,一个先调用setFristName来设置firstname, 而另一个线程调用getFirstName就会得到第一个线程所设的值。这是因为,PersonController是缺省情况下为单一实例(Singleton),而personService也是一个单独的实例被注入到personController里。这种情况下,多线程是不安全的,除非能够保证每个方法(method)都不会改变所共享的对象的属性或状态。


线程安全的方法

public class PersonController {   
 
    private PersonService personService
    
    public void setFirstName(HttpServletRequest request){        
      Person person = new Person();        
      person.setFirstName();        
      personService.savePerson(person);    
    }
 }

上面的例子是一种线程安全的写法,例如,线程A访问setFirstName方法,当它执行到person.setFirstName()后,系统决定挂起这个线程,转向执行B,B做了同样的事情并保存。然后,系统再执行被挂起的A线程,由于A线程有自己的堆栈状态,而且它本身没有与其他线程共享的对象实例或状态。需要补充说一下,这里假定personService.savePerson()方法是线程安全的,否则,还需要调查personService.savePerson()是否线程安全。

因此,在大多数情况下,spring bean是非线程安全的,或者说,如果你不告诉它如何管理对象或方法的线程安全,那么就会潜在线程安全问题。

spring bean因此给出了以下的线程安全的可用声明(annotation),你可以根据实际情况,分别定义你的类或方法。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式