5
回答
java并发编程疑问
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
今天看《java并发编程实战》,在看Servlet时,书上说大多数Servlet是无状态的,无状态对象一定是线程安全的,只有当Servlet在处理请求时需要保存一些信息,线程安全性才会成为一个问题。不大明白什么意思,请告知一下。 多谢!
举报
电脑小童
发帖于3年前 5回/439阅
共有5个答案 最后回答: 3年前

一个Object如果有Field的话,那么当多个线程修改这个Field的时候,就会出现问题了(某个线程还没用完,另一个线程把这个值给修改了).举个例子:

不安全的例子:

public class NotSafe{
	private int field1;
	public void notSafe(int userInput){
		field1 = userInput + 1;
		System.out.println(field1);
	}
}



安全的例子:
public class Safe{
	public void safe(int userInput){
		int localVar = userInput + 1;
		System.out.println(localVar);
	}
}



--- 共有 2 条评论 ---
hao5ang回复 @电脑小童 : 要知道原因: 每个线程使用一个方法,都会创建自己的局部变量,方法结束局部变量自动回收.field 是属于这个 object 的,多个线程共用这个 object 也就相当于共用 field. 你的那句话因为会涉及到很多东西,在这个场景下是正确的.等你学习东西多了,会更有意思 ;-) 3年前 回复
电脑小童是不是只要是方法中的就是线程安全的? 3年前 回复
意思是只有Servlet在处理请求时可能会存在多个线程同时修改一个对象,而大多数情况下,Servlet请求就像HTTP请求一样,无状态,即请求完成后就消亡了。

多线程无非是多个线程争用同一资源.只有在多个线程同时在处理请求时,才涉及到同一资源争用的问题,才需要考虑线程线程安全.

但是不知道没有HTTP请求过来,servlet没被调用,就是无状态吗?其中的对象就是无状态对象吗? ...

有状态/无状态对象的意思就是该对象是否保存数据(拥有成员变量或静态成员变量等等)。

无状态对象不保存数据,因此不涉及到多个线程共享数据的问题,肯定是线程安全的。

有状态对象需要保存数据,会涉及到线程共享数据的问题,有可能是线程不安全的,需要加上同步机制来确保线程安全。

顶部