我ThreadLocal什么时候应该使用变量?
怎么用?
java concurrency multithreading thread-local thread-confinement
一旦我遇到了一个模式,将where ServletRequest和响应对象放到servlet的局部ThreadLocal变量中.servlet类还有获取当前请求和响应对象的方法.因此,为了获得这些对象,您仍然需要使用servlet对象.
拥有这些ThrealLocal局部变量有什么意义?
我已经阅读了有关 ThreadLocal 及其使用的以下 SO 线程的有趣讨论。
这个问题更倾向于设计时选择。我的场景是这样的
如果我在 Web 应用程序中有一个值对象,几乎所有步骤都可能需要在同一个线程中使用它。我可以想到两个界面设计选项,如下所示
方法#1使用方法参数传递。
到目前为止,我一直专注于提出一个接口,该接口可以具有带有值对象接口参数的方法。
例如:
public interface SomeDataProcessorInterface {
public void processSomething(SomeValueObjectInterface vo);
}
public interface SomeValueObjectInterface extends Serializable {}
Run Code Online (Sandbox Code Playgroud)
方法 #2使用 ThreadLocal
在这种方法中,我可以有一个没有方法参数的接口,只需创建一个静态类来使用线程本地访问我的值对象。
例如:
public interface SomeDataProcessorInterface {
public void processSomething();
}
public interface SomeValueObjectInterface extends Serializable {}
public Class StaticClass {
private static ThreadLocal<SomeValueObjectInterface> threadLocalVO = new ThreadLocal<SomeValueObjectInterface>();
public static ThreadLocal getThreadLocal() {
return threadLocal;
}
Run Code Online (Sandbox Code Playgroud)
哪种方法更好?为什么?
这些实现中的哪一个实现内存泄漏的可能性较小?
这些实现中的哪一个对 …
我正在尝试添加一个Filter,它创建一个对象,然后在Spring Boot应用程序的控制器中使用.
我们的想法是将Filter用作此对象的"集中式"生成器 - 这是特定于请求的,仅在控制器中有用.我试过使用这个HttpServletRequest request.getSession().setAttribute方法:我可以在控制器中访问我的对象,但随后它会(明确地)添加到会话中.
滤波器是否是正确的方法?如果是,我在哪里可以保持过滤器生成的临时对象供控制器使用?
我想使用在MyT中定义的一些可变变量,它Thread在应用程序中扩展了Java ,其用途是Thread.currentThread.asInstanceof[MyT]引用和更新其中的可变变量.
这是线程安全的吗?
更新
我使用scala编写了一些应用程序而没有考虑多线程问题以及在对象中使用可变变量的所谓最糟糕的做法(因为它对于初学者来说非常容易使用!).
但现在不知何故,该项目扩展到Web应用程序,我必须处理多线程问题.
我没有时间再次重写代码,重构对象中的每个可变变量作为参数(可能是一个不使用全局对象可变变量的解决方案),所以我正在考虑将对象中的可变变量转移到扩展的线程类Threadclass,重构要使用的代码Thread.currentThread,然后将实例强制转换为我的扩展线程类型,然后引用/更新最初为全局可变变量的可变变量.
所以这是我原来的问题.
java ×4
thread-local ×3
concurrency ×1
interface ×1
java-ee ×1
scala ×1
servlets ×1
spring ×1
spring-boot ×1