android – 如何在前台和后台进程之间同步对sqlite db的访问?

android – 如何在前台和后台进程之间同步对sqlite db的访问?,第1张

概述我有一个在后台运行的服务,可以访问(读写)sqlite数据库.相应的前台进程(主应用程序)也可以访问(读取和写入)我的 android应用程序中的sqlite数据库. 如何防止与sqlite db同时访问/保存/读取相关的问题以及正确的方法是什么? 有两种简单的方法可以做到这一点,第一种是ChirstopheCVB写道:创建一个同步方法.同步方法只能由一个线程访问,其他线程被阻止. 这是推荐的方法 我有一个在后台运行的服务,可以访问(读写)sqlite数据库.相应的前台进程(主应用程序)也可以访问(读取和写入)我的 android应用程序中的sqlite数据库.

如何防止与sqlite db同时访问/保存/读取相关的问题以及正确的方法是什么?

解决方法 有两种简单的方法可以做到这一点,第一种是ChirstopheCVB写道:创建一个同步方法.同步方法只能由一个线程访问,其他线程被阻止.

这是推荐的方法,因为它将所有与数据库访问相关的代码保存在一个位置.当您更改数据库的表格布局时,无需搜索所有代码并进行调整.您可以隐藏主线程中的详细信息.

如果要将db代码保留在主线程中,请使用信号量.在Java中有支持:
http://developer.android.com/reference/java/util/concurrent/Semaphore.html

信号量是(简化的)单个对象,指示某人是否正在访问共享资源(例如,您的数据库).在访问数据库之前,请检查您是否被允许,如果允许,请设置对象以阻止其他对象.做你的事情并重置对象,以便其他人可以尝试访问资源.

一个简单的例子,假设您有线程A&线程B和全局变量canUse.

Init: canUse = true;Thread A:while (!canUse) wait;   // busy waiting,your thread is blockedcanUse = false;         // canUse was true,Now we grab access.do our thing;canUse = true;          // Others are allowed to use the resource again.

线程B看起来一样.

这有效,但有2个问题.首先,您正在阻止线程,因为您正在等待资源可用.存在风险,因为它可能永远不可用并且您有死锁.

第二个问题更严重.想象一下,你有3个线程:A,B和C. C抓住锁,A& A B正在等待.以下是可能的

A: while (!canUse) wait;B: while (!canUse) wait;C: canUse = true;A: Hooray,we can grab the resourceB: Hooray,we can grab the resourceA: canUse = false;B: canUse = false;

上面的示例显示了检查变量并以原子方式更改变量的重要性.换句话说,没有别的事情可以发生.

幸运的是,java为您提供了信号量.一开始并不容易理解,但必须理解你是否想要在不使用同步方法的情况下做你想要的事情(这样的方法可以为你做信号量而无需额外的编码工作).

总结

以上是内存溢出为你收集整理的android – 如何在前台和后台进程之间同步对sqlite db的访问?全部内容,希望文章能够帮你解决android – 如何在前台和后台进程之间同步对sqlite db的访问?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1129197.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存