FileLock实现进程互斥

需求step1:一个手机上有多个应用调用SDK.jar,但要求不能够同时运行多份SDK.jar,一次只能够有一个应用里面的SDK.jar在运行,不知道应用的包名什么;step2.APP进程异常终止的情况下也能正常工作.
(一个APP就是一个进程—–一个进程里面可以有多个线程—进程是资源分配的最小单位)
实现这个需求有如下几种做法:
1,用字符标识手机上已经有SDK.jar在运行
使用SharedPreference,ContentProvider都可以实现,将数据放在APP可以共享的目录;
应用跑SDK.jar之前先检测是否有其他应用在跑SDK.jar,没有SDK.jar再跑的时候才运行SDK.jar;
到这里可以完成step1,但是无法满足step2
2,资源互斥的角度去实现step2
基本思路:两个APP都是进程,它们能够访问同一个资源,设置在同一时间只能够有一个进程去使用这个资源.
具体实现:采用一个文件作为资源,多个APP都能够往里面写东西,但是在同一时间只能够有一个进程去写文件
使用FileLock对文件加锁,保证只能够有一个进程写文件;
参考博客:
1详解进程文件锁FileLock
2Android 文件锁研究 FileLock
关键代码:

/* * * @param path 文件路径 * @return */ public boolean
lock(String path) { try { Log.i(“lemon”, className + ” lock “);
if(TextUtils.isEmpty(path))
return false; if (raf == null)
raf = new RandomAccessFile(path, “rw”); raf.seek(raf.length());// raf在文件末尾追加内容的处理 if (channel == null)
channel = raf.getChannel(); if (lock == null)
lock = channel.lock();// 独占锁 ByteBuffer sendBuffer = ByteBuffer.wrap((new Date() + ” 写入\n”)
.getBytes()); channel.write(sendBuffer); return true; } catch (Exception e) { e.printStackTrace(); return false; } }

// 释放锁 public boolean release() { try { if (lock != null) {
lock.release();
lock = null; } if (channel != null) {
channel.close();
channel = null; } if (raf != null) {
raf.close();
raf = null; } return true; } catch (Exception e) { e.printStackTrace(); return false; } }

完整Demo工程代码在这里下载:
FileLock实现进程互斥
运行日志:
操作步骤:
One打开,点击加锁–出现com.sdk.one.MainActivity lock true
Two打开,点击加锁–出现com.sdk.two.FileLockUitl lock ,然后程序处于等待状态,陷入阻塞;
回到One,点击解锁–
com.sdk.one.MainActivity release true //One解锁成功
com.sdk.two.MainActivity lock true 此时 //Two被唤醒

log1

再看这个:
操作步骤:
One打开,点击加锁–出现com.sdk.one.MainActivity lock true
Two打开,点击加锁–出现com.sdk.two.FileLockUitl lock ,然后程序处于等待状态,陷入阻塞;
直接终止One:
com.sdk.two.MainActivity lock true 此时 //Two被唤醒
因为One被直接终止了,它的relase还执行,系统自动回收了资源,所以呢没有出现“com.sdk.one.MainActivity release true”
log2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值