考虑这么一种情况,有一块公公内存,有一个写进程对这块内存更新数据,还有多个读进程读取这块内存的数据。现在需要保证,写进程在写的时候禁止读进程读数据,同样,读进程读取的数据应该是一次完整的数据,也就是说不是上一次数据和这次被写过后的数据的混合。
简单的一个想法就是设置标志位,一个读操作标志和一个写标志。当写进程要写数据的时候等待直到没有读进程读取,再置写标志为1,写入数据,再将写标志置0。读进程类似的操作,循环等待直到写标志为0,然后将读标志位置1,再读取数据,完成后将读标志置0.
这个想法在大多数时候是可以正常工作的时候。但是极少数的时候,还是会出问题的。某个特殊时候,写进程读取读标志位为0,于是等待循环结束,正要将写标志置1的时候,由于进程调度,某个读进程这时候读到的写标志为0,于是该进程认为可以读取数据了。同时,写进程又开始运行,开始写入数据,这样两个进程就有了冲突,达不到预定的目标了。
由于不要求,读进程读取的时候禁止写进程写入,因此可以考虑这么一个算法。还是设置读写标志位,写进程的流程不变,只是读进程的流程稍微变一下,再读取数据之后,再检查一下写标志位,如果这时候写标志位有置1,则表明在读取的过程中有冲突发生,写进程意外写入数据,为了保证数据的正确性,这时候应该重新读取一遍数据。
这样的流程之下,可以保证达到预定要求,但是当数据比较多的时候,由于冲突,读进程要把花了很多时间的数据废掉再重新读一次,这样效率是比较低的。在这里可以做一个改进,读进程分块读取数据。每读取一块的数据都要检查写标志位。如果有置1就要重新读取全部数据。其实冲突发生多是在读进程刚刚读取数据的

本文探讨了一种确保一写多读数据一致性的算法,通过设置读写标志位避免读写冲突。当写进程写入时,读进程会检查并可能需要重新读取数据以保证正确性。在Java中实现该算法时,考虑到效率问题,对读进程进行分块读取,并在读取大量数据时避免不必要的重读操作,以优化性能。

1万+

被折叠的 条评论
为什么被折叠?



