我不仅仅对锁和同步块有基本的了解。但是,据我所知,他们只是确保一个线程一次可以访问某些数据。
我需要的是有点不同。让我们说我有一个字符串。我改变它的唯一一个线程(给它分配一些值),并假设这个操作花了很多时间--3秒。
许多其他线程需要读取此String的值,并执行一些操作(执行代码块),并假设值保持不变直到整个块执行。让我们假设这个块需要5秒才能执行。
所以,"作家"当有线程使用/读取它时,线程不能更新字符串,并且"读取器"线程必须等待更新(由#34; writer")完成才能开始使用它。
如果只有1"作家"我可以用锁来解决这个问题。和1"读者",但是如果有1" writer"我怎么能这样做呢?和N"读者"。请注意,许多读者"可以同时访问数据。
顺便说一下,提供代码很难,因为它有数百行,包括互联网访问,数据库访问......
我知道我可以通过改变我的实现来避免这个问题,但我有理由更喜欢这种实现 - 而且我不会懒得改变它。
答案 0 :(得分:5)
您要找的是ReadWriteLock 。多个线程可以同时读取的位置。写入被阻止,直到读取线程完成。 读取被阻止,直到写线程结束。
答案 1 :(得分:-1)
如果操作需要很长时间,那么你做错了什么。正确的方法是计算新数据,无论多长时间,而不影响旧数据,然后一次性用新数据替换旧数据。并且仅在使用它的每个人都完成时才销毁旧数据。