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

Java 并发Android服务之间的资源共享或文件锁定,java,android,multithreading,service,Java,Android,Multithreading,Service,我的Android应用程序中有三项服务,由两个广播接收器启动。前两个写入文件并由一个广播接收器触发,因此我可以确保它们一个接一个地执行(通过Context.sendOrderedBroadcast())。第三个是独立的,由一个单独的广播接收器触发,但从前两个写入的同一个文件中读取 由于广播接收机可以彼此同时或几乎同时发射,因此也可以同时访问文件。我怎样才能防止这种情况发生?我希望能够先读后写或者先写后读。我只是不确定这个问题是否与Java并发性一般相似,因为如果我没有弄错的话,android服务

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


由于广播接收机可以彼此同时或几乎同时发射,因此也可以同时访问文件。我怎样才能防止这种情况发生?我希望能够先读后写或者先写后读。我只是不确定这个问题是否与Java并发性一般相似,因为如果我没有弄错的话,android服务是一个完全不同的野兽。

一个解决方案是让您的编写任务创建一个空的临时文件(比如
.lock
)访问共享文件之前,请在访问完成后删除同一临时文件

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

或者,您可以使用。

请注意,与其他应用程序对象一样,服务在其宿主进程的主线程中运行。这意味着,如果您的服务要执行任何CPU密集型(如MP3播放)或阻塞(如网络)操作,它应该生成自己的线程来执行该工作


我建议在单独的线程中读取/写入文件。您可以使用在同一线程中执行此操作。

首先,我不应该在主UI线程中执行文件I/O,这与
服务的情况相同。它应该在另一个线程中完成,比如
AsyncTask


其次,
ReentrantLock
方法简单得多。锁定时,它告诉访问同一资源的其他线程等待,并仅在释放锁后继续。只需实例化一个
新的ReentrantLock()
,并在读取或写入文件的方法之间共享该锁。您可以根据需要在
ReentrantLock
上调用
lock()
unlock()

如果我在服务中生成一个单独的线程来执行这些任务(实际上,我更多考虑的是
异步任务
),即使使用了
sendOrderedBroadcast()
,我也不会失去对前两个服务背靠背执行的控制吗?也就是说,因为这两个服务内部有单独的线程,我将无法一个接一个地执行这两个服务。我不太确定这两个服务中的任何一个是好的解决方案。1) 创建
.lock
文件可能需要比服务本身能够访问文件更多的时间。2) 我只是尝试了一下,但显然它不起作用:@mattquiros感谢您的反馈-如果您找到更好的方法,请毫不犹豫地添加您自己的答案(并接受它)。不幸的是,我还没有,尽管有人告诉我要看一看
ReentrantLock
。类似于您的建议,但可与其他线程重复使用。