【问题标题】:One thread writes data while not being read, many threads read while data is not being written一个线程写入数据而不被读取,多个线程读取而不被写入数据
【发布时间】:2014-08-08 16:32:18
【问题描述】:

我不仅对锁和同步块有基本的了解。但是,据我所知,它们只是确保单个线程一次可以访问某些数据。

我需要的有点不同。可以说我有一个字符串。我更改了一个且只有一个线程(为其分配一些值),并假设此操作需要很长时间 - 3 秒。

很多其他线程需要读取这个String的值,并假设在整个块执行之前值保持不变,并执行一些操作(执行一段代码)。让我们假设这个块需要 5 秒来执行。

因此,当有线程使用/读取字符串时,“编写器”线程不得更新字符串,并且“读取器”线程必须等待(由“编写器”)完成更新,然后才能开始使用它。

如果只有 1 个“作者”和 1 个“读者”,我可以用锁解决这个问题,但是现在有 1 个“作者”和 N 个“读者”,我怎么能做到这一点。请注意,许多“读者”可能同时访问数据。

顺便说一句,提供代码有点困难,因为它有数百行,包括互联网访问,数据库访问......

我知道我可以通过改变我的实现来避免这个问题,但我有理由更喜欢这个实现——而且我不是懒得改变它。

【问题讨论】:

  • @TheLostMind 更好

标签: java multithreading


【解决方案1】:

您正在寻找的是ReadWriteLock .多个线程可以同时读取。写入被阻塞,直到读取线程完成。并且 reads 会被阻塞,直到 writing 线程完成。

【讨论】:

    【解决方案2】:

    如果操作需要这么长时间,那么您做错了什么。正确的方法是在不影响旧数据的情况下,计算新数据,不管需要多长时间,然后一次性用新数据替换旧数据。并且只有在每个使用它的人都用完它时才销毁旧数据。

    【讨论】:

    • 看OP的最后一句话。这正是他试图阻止的答案。
    • 这只是改变我的实现的方法之一,实际上并不是最适合我的情况。但我想避免改变它。由于互联网访问延迟,操作需要很长时间,我对此无能为力。
    猜你喜欢
    • 2016-02-24
    • 2012-04-01
    • 2021-08-16
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多