gpt4 book ai didi

Java:在访问非同步类的多个线程之间创建一个中间人类?

转载 作者:太空宇宙 更新时间:2023-11-04 08:20:12 25 4
gpt4 key购买 nike

因此,从这个问题中获取线索Multithreaded access to file

我的场景是我有一个电子表格组件,其中多个线程将访问和写入每个工作簿。组件本身不是线程安全的,所以我的想法是否正确:当一个线程正在写入它时,其他线程需要被阻塞,直到第一个线程完成写入?当我处理非线程安全类时,我将如何实现这一目标?将写入方法放在同步块(synchronized block)中?

这引起的另一个问题是,如果一个线程正忙于将长行数据写入其各自的工作簿,则另一个线程将不得不停止运行,直到第一个线程完成,这是不可取的。

相反,我想象这样一个场景:每个线程运行时不会相互阻塞,但写入电子表格的数据是由另一个中间人类完成的,该中间人类将缓冲数据并将数据刷新到电子表格组件上,而不会导致多个线程“等待”直到其写入过程完成。

基本上每个线程自己做两件事。 1) 对来自各个源的数据执行一些长时间运行的处理,2) 将处理后的数据写入电子表格。我正在寻求一种并发解决方案,其中 1) 不会因 2) 而面临“等待”。

最佳答案

最佳解决方案实际上取决于您在电子表格上执行的操作类型。例如,如果一个线程需要读取另一线程写入的值,则可能需要一次锁定整个电子表格或至少锁定特定行。由于电子表格本身不是线程安全的,因此您需要自己进行同步,这是正确的。

如果序列化所有访问很重要(这会损害性能,因为它消除了并行性),请考虑使用线程安全队列,其中每个线程将一个对象添加到队列中,该对象表示它想要执行的操作。然后,您可以让工作线程从队列中提取项目(同样,以线程安全的方式,因为队列是线程安全的)并执行操作。

这里可能有空间来并行化队列工作人员,因为它们可以相互通信,并在它们之间进行一些基于行的锁定。例如,如果第一个操作是读取第 1-4 行并写入第 5 行,第二个操作是读取第 6-10 行并写入第 11 行,那么这些操作应该能够并行执行。但这里要小心,因为它可能取决于电子表格的底层结构,你说它不是线程安全的。尽管如此,读取可能可以并行执行。

虽然不简单,但同步对队列的访问是基本的读写器问题,虽然您必须确保避免饥饿和死锁,但它比随机访问电子表格要容易得多。

也就是说,最好的解决方案是使用线程安全的电子表格,或者仅使用一个线程来访问它。为什么不使用数据库支持的电子表格,然后让多个线程同时读取/写入数据库?

关于Java:在访问非同步类的多个线程之间创建一个中间人类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9695857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com