java+lock+trylock_java – FileChannel tryLock()方法是检查锁还是只是破坏它们?

我有两个进程可以查看相同的文件,并希望实现文件锁定.问题似乎是一个进程用

java编写而另一个进程用C编写,并且不清楚java端如何实现低级锁定.该平台是Solaris 10.我尝试在文件上引入锁定,以防止在C进程读取文件时

Java进程进行更新.我的想法是尝试从java代码中获取一次锁定10次,然后才无条件地写入文件(我假设锁定类型是一个咨询锁定).但是,java tryLock()会在第二次尝试时中断C进程的锁定并破坏读取.

这是代码,简化(Java):

int iAttemptCnt = 0;

FileChannel wchannel = new FileOutputStream(new File(fileName), false).getChannel();;

FileLock flock;

while(true){

try{

MyLog.log(MyLog.LVL_INFO, "attempt to lock file");

if( (flock = wChannel.tryLock()) == null ){

// lock held by another program

if(++iAttemptCnt >= 10

break;

}

else{

MyLog.log(MyLog.LVL_INFO, " file locked");

break;

}

}catch(OverlappingFileLockException ofle){

.......

if(++iAttemptCnt >= 10 ){

...

break;

}

}catch(IOException ioe){

throw new IOException("failed to lock the file");

}

try{

MyLog.log(MyLog.LVL_INFO, "File already locked, retrying in one second");

Thread.sleep(1000);

}catch(InterruptedException ie){

.....

}

}

C代码使用fcntl:

fd = open(filename, O_RDONLY);

.....

lck.l_type = F_RDLCK;/* F_RDLCK setting a shared or read lock */

lck.l_whence = 0; /* offset l_start from beginning of file */

lck.l_start = 0LL;

lck.l_len = 0LL; /* until the end of the file address space */

....

while( fcntl(fd, F_SETLK64, &lck) < 0){

if( errno == EAGAIN )

....

else if (errno == EIO )

...

else if( errno == ENOLCK)

...

else if (errno == EDEADLK)

...

if(++ii == 10 ){

break;

}

...

sleep(1);

}

MyLongLastingRead();

...

lck.l_type = F_UNLCK;

fcntl(fd, F_SETLK, &lck);

close(fd);

tryLock()是否真的检查锁定?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值