我的 Android 应用程序中有一个特定的更新方法,它会生成相当多的数据 - 多达数百个数据库条目。除了 UI 线程,我还有一个后台服务。两个线程都必须执行更新方法,有时甚至同时执行——基本上,这是关于生成和缓存要显示的数据。UI 和后台服务都需要这些数据。
目前,我已经将方法的执行包装在一个 ORMLite 事务中,该事务映射到一个普通的 SQLite 事务。但是,恐怕有一天,当某些竞争条件破坏了数据缓存时,这会咬我一口。
问题:SQLite 事务是否保护我免受并发执行,或者我应该实现某种在生成器方法启动时产生的工作线程,或者如果生成器方法已经运行则阻塞?
更新:
我决定不依赖 SQLite 逻辑来保护我的高级 Java 方法。解决方案对我来说如下:
- 将方法的生成部分包装为
synchronized
- 引入一个变量,跟踪最后一次执行方法的时间(设置在方法的最后,所以它是执行结束的标志)
- 本节中的第一件事
synchronized
,检查最后一次执行是否在特定阈值内(例如过去 <= 100ms)- 如果是,跳过生成
- 如果没有,执行生成
这样,就不应该发生重复生成,因为当同时从两个线程访问该方法时,第一个会生成,而第二个不会。对我来说最重要的部分是它仍然是阻塞的,因为两个线程都依赖于它们调用该方法后发生的生成。