在Java中共享ThreadLocal变量

| 在我的小型应用程序中,我有两个类的线程-基本上是作家和读者。可以将多个读者分配给一个作者。作家通过写给他们的“ 0”变量来与读者互动。 现在,我无法完全解决线程安全问题:如果我不将ѭ0存储在静态
ThreadLocal
变量中,则所有读取器将共享一个chunkBuffer,这很糟糕。但是,如果我确实将chunkBuffer存储在静态的“ 2”中,则作为单独线程的编写器将获得其自己的chunkBuffer副本并继续对其进行写入,而写入的任何数据都不会到达读取器。您能告诉我这里有什么问题吗?非常感谢你。 编辑换句话说,是否有一种方法可以创建一个字段,该字段对于线程子类的每个单个实例(例如ThreadLocal)都是唯一的,但可以根据需要从其他线程访问?     
已邀请:
不。 ThreadLocal用于线程专用数据。在您的情况下,您需要对象进行通信,因此您需要其他类型的对象。 我认为最好使用的结构是同步队列:
java.util.concurrent.LinkedBlockingQueue<E>
。 队列允许生产者插入数据,而消费者可以从中消费。如果同步,则可以在不破坏结构的情况下从不同的线程进行操作。 您可以在相关作者/读者之间共享队列:
Writer 1 -> queue 1 -> [readers A/B/C]

Writer 2 -> queue 2 -> [readers D/E/F]
每个作者和读者都有其线程。如果没有项目,每个阅读器将尝试从其队列阻塞中取出一项。如果您需要更明智地管理读者,则可以尝试更复杂的方法,但是我认为这是一个很好的起点。     
我不认为您想使用ThreadLocal变量。您确实需要一个通知机制。 作家执行以下操作: 写给读者的ѭ0 通知读者新数据。 在Java并发中,有很多方法可以做到这一点,但是最简单,最安全的方法是使用
ArrayBlockingQueue
。在您的用例中,听起来每个阅读器都有自己的
ArrayBlockingQueue
,只需要读取队列即可。 当然,这取决于您的用例。是否有必要始终处理最新数据,还是每次写入
chunkBuffer
都需要处理?这些问题对于确定所需的机制是必不可少的。 注意:@helios提到同步队列的道具,希望我的回答能增加价值。     

要回复问题请先登录注册