繁体   English   中英

并发Android服务之间的资源共享或文件锁定

[英]Resource sharing or file lock among concurrent Android services

我的Android应用程序中有三个由两个广播接收器触发的服务。 前两个写入文件并由一个广播接收器触发,因此我可以确保它们一个接一个地执行(通过Context.sendOrderedBroadcast() )。 第三个是独立的,并由单独的广播接收器触发,但是从前两个写入的文件中读取。

因为广播接收器可能在彼此同时或几乎同时被触发,所以也可能同时访问文件。 如何防止这种情况发生? 我希望能够先读取然后写入,或者先写入再读取。 我只是不确定这个问题是否总体上类似于Java并发,因为如果我没记错的话,android服务是完全不同的野兽。

一种解决方案是让您的写入任务在访问共享文件之前创建一个空的临时文件(例如.lock ),并在完成操作后删除该相同的临时文件。

您的阅读任务可以检查.lock文件是否存在。

或者,您可以使用FileLock

http://developer.android.com/reference/android/app/Service.html请注意,服务与其他应用程序对象一样,在其托管过程的主线程中运行。 这意味着,如果您的服务要执行任何占用大量CPU资源(例如MP3播放)或阻塞(例如网络)的操作,则它应产生自己的线程来执行此工作。

我建议在单独的线程中读取/写入文件。 您一次只能使用一个线程! 在同一线程中执行。

首先,我不应该在主UI线程中完成文件I / O,而Service就是这种情况。 它应该在另一个线程中完成,例如AsyncTask

其次, ReentrantLock方法非常容易。 锁定后,它会通知访问同一资源的其他线程等待,并且仅在释放锁定时继续进行。 只需实例化一个new ReentrantLock()并在读取或写入文件的方法之间共享该锁。 就像您需要在ReentrantLock上调用lock()unlock()一样简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM