设为首页 加入收藏

TOP

单机上多JVM同步控制的一种方法(二)
2014-11-24 14:08:15 来源: 作者: 【 】 浏览:4
Tags:机上 JVM 同步 控制 方法

try {
f2=new RandomAccessFile("test.txt","rw");
//f2.writeChars("123");
channel2 = f1.getChannel();

lock2 = channel2.lock();

if(lock2!=null) System.out.println("1:success");
else System.out.println("1:fail");

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


try {
if(lock1!=null) lock1.release();
if(lock2!=null) lock1.release();

if(channel1!=null) channel1.close();
if(channel2!=null) channel2.close();


if(f1!=null) f1.close();
if(f2!=null) f2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

testTryLock();
// testLock();

}


}


直接运行会出现:


1:success
Exception in thread "main" java.nio.channels.OverlappingFileLockException
at sun.nio.ch.FileChannelImpl$SharedFileLockTable.checkList(Unknown Source)
at sun.nio.ch.FileChannelImpl$SharedFileLockTable.add(Unknown Source)
at sun.nio.ch.FileChannelImpl.lock(Unknown Source)
at java.nio.channels.FileChannel.lock(Unknown Source)
at test.TestRandomAccessFile.testLock(TestRandomAccessFile.java:107)
at test.TestRandomAccessFile.main(TestRandomAccessFile.java:147)


一个JVM运行一半,另一个运行全部,


运行一半的 JVM 会出现:


1:success


运行全部的 JVM 会出现:


1:fail
1:fail


要想获取整个文件的锁,可以用FileChannel的tryLock( )或lock( )方法。(SocketChannel,DatagramChannel,以及 ServerSocketChannel是不需要锁的,因为它们原本就是"进程实体(single-pricess entities)";一般来说,你是不会让两个进程去共享一个网络socket的。)tryLock( ) 是非阻塞的。它会试着去获取这个锁,但是如果得不到(其它进程已经以独占方式得到这个锁了),那它就直接返回。而lock( )是阻塞的。如果得不到锁,它会在一直处于阻塞状态,除非它得到了锁,或者你打断了调用它(即lock( )方法)的线程,或者关闭了它要lock( )的channel,否则它是不会返回的。最后用FileLock.release( )释放锁。


关于 testLock();的测试这里就不在给出具体的情况了。


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android按键学习:RadioButton 下一篇ARM支持的数据宽度

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: