设为首页 加入收藏

TOP

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

在一个JVM进程中的同步控制,无非就是线程之间的同步问题,但要想在多JVM进程之间实现访问本地系统资源的同步,却并非JVM所擅长的了。当然,若依赖第三方Master主控进程,这个问题还是可以解决的。多于简单的系统而言,这样做无疑会增加系统的复杂性,从而导致整个系统的不稳定性和潜在的不安全。所以,下面就如何在单机上实现多JVM进程之间的同步控制,给出了一个简单的方法。


JDK 1.4的文件锁"file locking"允许你以文件为共享资源,对访问进行同步化处理(allows you to synchronize access to a file as a shared resource)。但是,竞争文件的两个线程必须属于两个不同的JVM,或者一个是Java线程,另一个是操作系统的本地线程。由于Java的文件锁是直接映射操作系统的锁机制的,因此其它进程也能看到文件锁。


import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;


public class TestRandomAccessFile {


public static void testTryLock(){
RandomAccessFile f1=null;
RandomAccessFile f2=null;

FileChannel channel1=null;
FileChannel channel2=null;

FileLock lock1=null;
FileLock lock2=null;

try {
f1=new RandomAccessFile("test.txt","rw");
//f1.writeChars("asd");
channel1 = f1.getChannel();

lock1 = channel1.tryLock();
if(lock1!=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 {
f2=new RandomAccessFile("test.txt","rw");
//f2.writeChars("123");
channel2 = f1.getChannel();

lock2 = channel2.tryLock();

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();
}


}


public static void testLock(){
RandomAccessFile f1=null;
RandomAccessFile f2=null;

FileChannel channel1=null;
FileChannel channel2=null;

FileLock lock1=null;
FileLock lock2=null;

try {
f1=new RandomAccessFile("test.txt","rw");
//f1.writeChars("asd");
channel1 = f1.getChannel();

lock1 = channel1.lock();
if(lock1!=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();
}

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

评论

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