为什么在 Java 中不使用实例对象而不是 ThreadLocal?

泡菜驴

我在读文章关于Java的ThreadLocal的对象,试图理解为什么以及何时会使用它们。在本文中,我遇到了一个示例,旨在演示如何使用 ThreadLocal。它是一个应该是事务管理器的类,它使用了一个在整个类中使用的静态事务 ID 变量。为了使类线程安全,它使用 ThreadLocal 作为 transactionID:

public class TransactionManager {

    private static final ThreadLocal<String> context = new 
    ThreadLocal<String();

    public static void startTransaction() {
        //logic to start a transaction
        //...
        context.set(generatedId); 
    }
    public static String getTransactionId() {
        return context.get();
    }
    public static void endTransaction() {
        //logic to end a transaction
        //…
        context.remove();
    }
}

我的问题是,为什么不让 transactionID 成为一个实例变量,而不是首先将其设为静态?这样你就不需要使用 ThreadLocal 变量。

吉尔顿

在某些情况下,差异会发生变化,但让我们尝试一些事情:

我将假设示例的大纲类似于“我们正在某个流程中执行多个步骤,我们想要生成一个事务 ID 来标识该流程的一次执行。对于任何给定的执行,所有这些步骤都在同一线程中运行”

在这种情况下,不同之处在于,如果您将其设为实例变量(是的,您可以做到),您将必须创建您的 transactionId 并在您可能需要将其作为参数的所有层和类中传播 TransactionManager 实例,使您的方法签名比需要的更脏(假设您有一个 StepExecution 接口并且所有步骤都实现了该接口,但并非所有步骤都可能需要访问 transactionID,然后您将在方法签名中混入一个无用的参数)

不仅如此,ThreadLocal 将保证您正在访问的值是您在同一线程上生成的值,从而防止线程之间的信息“泄漏”,使其完全线程安全。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么 ThreadLocal 在 Java 中只有 threadLocalHashcode

来自分类Java

为什么在Java规范中未定义ThreadLocal或AnnotationProcessor?

来自分类Java

Java中的volatile与threadLocal

来自分类Java

为什么Java ThreadLocal变量应该是静态的

来自分类Dev

为什么在 Thread 中使用 map 来存储 ThreadLocal 对象?

来自分类Java

为什么ThreadLocal不在新线程中创建?

来自分类Dev

为什么要在ThreadLocal上使用数据插槽?

来自分类Java

对于大多数基于散列的结构,除了ThreadLocal之类的语言,Java的语言设计者为什么偏向于链接而不是开放地址?

来自分类Dev

为什么 ThreadLocal.ThreadLocalMap 使用 Entry Array 而不是 Single Entry 来保存数据?

来自分类Java

在Java中使用ThreadLocal的良好实践

来自分类Dev

ThreadLocal.java中0x61C88647常量的含义是什么

来自分类Java

如何在Java中初始化ThreadLocal对象

来自分类Java

字符串是Java中的对象,那么为什么不使用'new'创建它们呢?

来自分类Dev

为什么虽然是引用类型,但使用ThreadLocal的Value成员的本地副本的速度更快?

来自分类Java

Java为什么允许使用对象实例访问静态成员

来自分类Java

为什么ThreadLocal变量需要静态?

来自分类Java

为什么在Java中不使用const关键字?

来自分类Dev

为什么在Java中不使用int基本类型

来自分类Java

为什么在参数中不使用Java 8的Optional

来自分类Java

Java ThreadLocal静态吗?

来自分类Dev

为什么java中的HashMap在内部使用数组来存储条目对象而不是ArrayList?

来自分类Dev

为什么不使用java.util.List检查java.lang.reflect.Field的实例

来自分类Java

为什么EnumMap不是Java中的SortedMap?

来自分类Java

为什么不是(123 == 0123)在Java中?

来自分类Dev

为什么Java对lambda函数使用->而不是=>?

来自分类Java

将ThreadSafe对象放在ThreadLocal上有什么好处?

来自分类Java

Java-如何在Eclipse中检查“ ThreadLocal”变量的值?

来自分类Dev

如果线程本地映射包含对threadlocal对象的弱引用,那么为什么不进行垃圾回收呢?

来自分类Java

为什么在Java中首选使用列表而不是数组?

Related 相关文章

  1. 1

    为什么 ThreadLocal 在 Java 中只有 threadLocalHashcode

  2. 2

    为什么在Java规范中未定义ThreadLocal或AnnotationProcessor?

  3. 3

    Java中的volatile与threadLocal

  4. 4

    为什么Java ThreadLocal变量应该是静态的

  5. 5

    为什么在 Thread 中使用 map 来存储 ThreadLocal 对象?

  6. 6

    为什么ThreadLocal不在新线程中创建?

  7. 7

    为什么要在ThreadLocal上使用数据插槽?

  8. 8

    对于大多数基于散列的结构,除了ThreadLocal之类的语言,Java的语言设计者为什么偏向于链接而不是开放地址?

  9. 9

    为什么 ThreadLocal.ThreadLocalMap 使用 Entry Array 而不是 Single Entry 来保存数据?

  10. 10

    在Java中使用ThreadLocal的良好实践

  11. 11

    ThreadLocal.java中0x61C88647常量的含义是什么

  12. 12

    如何在Java中初始化ThreadLocal对象

  13. 13

    字符串是Java中的对象,那么为什么不使用'new'创建它们呢?

  14. 14

    为什么虽然是引用类型,但使用ThreadLocal的Value成员的本地副本的速度更快?

  15. 15

    Java为什么允许使用对象实例访问静态成员

  16. 16

    为什么ThreadLocal变量需要静态?

  17. 17

    为什么在Java中不使用const关键字?

  18. 18

    为什么在Java中不使用int基本类型

  19. 19

    为什么在参数中不使用Java 8的Optional

  20. 20

    Java ThreadLocal静态吗?

  21. 21

    为什么java中的HashMap在内部使用数组来存储条目对象而不是ArrayList?

  22. 22

    为什么不使用java.util.List检查java.lang.reflect.Field的实例

  23. 23

    为什么EnumMap不是Java中的SortedMap?

  24. 24

    为什么不是(123 == 0123)在Java中?

  25. 25

    为什么Java对lambda函数使用->而不是=>?

  26. 26

    将ThreadSafe对象放在ThreadLocal上有什么好处?

  27. 27

    Java-如何在Eclipse中检查“ ThreadLocal”变量的值?

  28. 28

    如果线程本地映射包含对threadlocal对象的弱引用,那么为什么不进行垃圾回收呢?

  29. 29

    为什么在Java中首选使用列表而不是数组?

热门标签

归档