java:如果我在每个请求上创建新对象,我还需要线程吗?

时间:2011-05-24 12:25:10

标签: java thread-safety

一般问题它可以在c我猜也 如果我有(在我的情况下http requst类)从包装函数
调用 这个包装函数是公共API。然后在包装器函数内部初始化新的Request对象,该对象假设使用来自包装器函数的参数进行请求 我需要在线程中包装请求对象(我有执行工作线程的线程池类)
为每个请求在堆栈上创建对象会做什么? 例如:

public void Wrapper(String a,String b)
{

// im doing ..
MyRequst req = new MyRequest(a,b); // will do the http requst 

}

or to do :

public void Wrapper(String a,String b)
{

// im doing ..
MyThreadPool.GetInstance().RunTask(new MyRequest(a,b)); // will do the http request 

}

2 个答案:

答案 0 :(得分:3)

问题不是很清楚,但从可以推断的内容来看,相关的问题是创建局部变量是否足以满足线程安全性。答案是肯定的。

来自Java Concurrency in Practice

  

访问共享的可变数据   需要使用同步;单向   避免这个要求是不是   分享。如果仅从a访问数据   单线程,没有同步   需要的。

应该记住,所有对象都存储在堆上。堆栈上的项目是primitives and references to objects on the heap, and are termed as local variables,并且总是一个字宽(除了long和double值);这些变量不应与Java编程语言中的方法局部变量的概念相混淆(人们错误地认为这些变量存储在堆栈中)。

通过使用局部变量,可以确保堆上的对象只能被当前执行的线程访问,除非当然尝试与其他线程共享此类对象(在这种情况下,需要使用适当的同步技术)受雇)。

答案 1 :(得分:0)

这可以替代您可能尝试的操作。 我假设您正在尝试操纵请求对象。你考虑过使用“HttpServletRequestWrapper”吗?

http://download.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletRequestWrapper.html

点击此链接:http://www.oracle.com/technetwork/java/filters-137243.html 在上面的网页中转到“编程自定义请求和响应”部分。

另一个例子, http://www.coderanch.com/t/172274/java-Web-Component-SCWCD/certification/When-HttpRequestWrapper