ThreadLocal vs 参数传递 - 在接口设计中选择什么?

sof*_*dia 6 java interface thread-local

我已经阅读了有关 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)

哪种方法更好?为什么?

这些实现中的哪一个实现内存泄漏的可能性较小?

这些实现中的哪一个对 Java 垃圾收集器有好处?

我通读了其他线程中的一些要点,但是如果我从头开始,我仍然不清楚哪种方法更好。

Sot*_*lis 1

使用static TheadLocals 时,如果您忘记删除该元素,则可能会面临内存泄漏的风险。您始终可以通过在从方法返回之前删除该元素来避免这种情况。我不会推荐这种方法。

按照目前的情况,您的第一种方法已经是线程安全的,因为参数仅对于该方法调用是本地的。用这个吧。