我们有一个15yo“胖客户端”Swing应用程序(我会将其归类为“遗留”,但我们还没有任何替代它)。它通过Internet从我们的DC加载数据(对象图),一些客户端的数据以数千兆字节(解压缩和反序列化)运行。
我的问题是,对象图是从EventDispatchThread和后台线程访问而没有同步。 15年前,这没有引起任何问题,但现在,每个人都使用多核处理器,我们几乎每天都会得到随机同步相关的不可重现的错误。模型上的某些操作可能需要几分钟,因此我们无法通过在那里运行那些操作来阻止EventDispatchThread。我们需要重构UI以便它不直接访问模型,并且只处理它所需的数据的“副本”(或者至少,我没有看到任何其他不会导致UI的解决方案冻结)。
不幸的是,我们的代码库非常庞大(如果我们包含所有内容,现在约为2M LOC),因此这将是大型重构。
我正在寻找的是从EventDispatchThread(或任何特定线程,基于一些白/黑名单)中记录“模型”(对象图)的“非同步”访问的一些意思,仅在测试/开发中,因此我们可以逐步修补代码。
那么,如何从EventDispatchThread 中检测对模型/对象图的访问,而不必使用支票手动修改整个代码库?
我希望这可以通过特殊的ClassLoader / SecurityManager / Bytecode-Manipulation的某种组合来完成,但我不知道从哪里开始寻找。
ATM,模型和UI类在相同的包和/或罐中部分混合在一起,但我相信应该在合理的时间内将它们分开。