一般问题它可以在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
}
答案 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