java - 在 Java 中共享一个 ThreadLocal 变量

标签 java concurrency thread-safety thread-local

在我的小应用程序中,我有两个类的线程 - 基本上是作者和读者。多个读者可以分配给一个作家。作者通过写入他们的 chunkBuffer 变量与读者互动。

现在,我不能完全解决这里的线程安全问题:如果我不将 chunkBuffer 存储在静态 ThreadLocal 变量中,所有读者都会共享单个 chunkBuffer,这很糟糕。但是如果我确实将 chunkBuffer 存储在一个静态的 ThreadLocal 中,作为一个单独线程的编写器将获得它自己的 chunkBuffer 副本并继续写入它,而它写入的数据都不会到达读者。你能给我解释一下这里有什么问题吗?非常感谢。

编辑 换句话说,有没有一种方法可以创建一个字段,该字段对于线程子类(如 ThreadLocal)的每个实例都是唯一的,但可以根据需要从其他线程访问?

最佳答案

没有。

ThreadLocal 用于线程私有(private)数据。在您的情况下,您需要对象进行通信,因此您需要其他类型的对象。

我认为最好的结构是同步队列:java.util.concurrent.LinkedBlockingQueue<E> .

队列允许生产者插入数据和消费者消费。如果它是同步的,它允许在不破坏结构的情况下从不同的线程执行它。

您可以在相关的作者/读者之间共享一个队列:

Writer 1 -> queue 1 -> [readers A/B/C]

Writer 2 -> queue 2 -> [readers D/E/F]

每个作者和读者都会有自己的线程。如果没有项目,每个读者将尝试从其队列阻塞中取出一个项目。如果您需要更明智地管理您的读者,您可以尝试更复杂的方法,但我认为这是一个很好的起点。

关于java - 在 Java 中共享一个 ThreadLocal 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5802683/

相关文章:

java - 为什么第二个循环比第一个循环快

java tcp 服务器到 Android 设备

java - 无法使用 Thread.start() 启动 JavaFX 任务

amazon-web-services - 无服务器函数中的并发问题 (AWS/Azure)

java - 这个类是线程安全的吗?

java - 公历年份设置不正确

java - 用java读取Dxf文件

java - java 中的显式锁定与内在锁定降级

.net - 多线程写入,从队列中读取一个线程,线程安全

iphone - NSIncationOperation 和主线程