通常,如果我们有许多资源由单个模块拥有并由许多线程修改,并且我们希望在这些线程之间保持数据一致性,那么一种方法是使用锁。
但是,当资源分配到多个模块时,这似乎是不可能的。例如,假设我们有三个模块,它们是 SocketsLayer,SessionLayer,FileTransferLayer 。以及其他一些假设:
SocketsLayer
维护所有(非阻塞)插座;
使用一个线程来收听和读取套接字;
关闭时使用相同的线程删除套接字,并异步通知 SessionLayer 。
会话层
为每个用户创建一个会话;
每个用户都有一个名为CmdChannel的套接字用于发送/接收命令;
每个用户都有几个名为DataChannel的套接字,用于发送/接收文件数据;
每个(用户名,cmd套接字,数据套接字)称为会话
一旦套接字被注册为USER的CmdChannel,就会创建该用户的会话
一旦CmdChannel关闭或损坏,拥有它的Session变为无效(BE DELETED)
会话失效后,所有数据套接字都无效
使用一个线程来创建会话和删除会话。
FileTransferLayer
每个用户都有几个文件传输任务;
每个文件传输任务都有自己的数据套接字;
所有任务属于一个用户共享一个命令套接字;
一旦用户的会话失效,必须删除属于该用户的任务
使用一个线程来创建任务和删除任务。
假设正在为 SomeUser (由 SessionLayer 处理)注册一个cmd频道,现在 SessionLayer 将创建一个会话此用户。但是,如果在创建会话期间此对象已关闭此cmd套接字,该怎么办?
更新
SocketLayer 中的套接字和 SessionLayer 中的会话以及 FileTransferLayer <中的任务 / strong>,所有这三类数据属于同一用户必须保持一致。但是它们由不同的模块拥有,那么如何在这三个模块之间保持数据的一致性呢?