请教怎样进行文件锁定!
我要用一个 可序列化对象 ,将自己保存在文件中来实现 将计数器对象保存在文件中。
我的计数器是针对每一个 session就会加一。
具体方法是:
1,如果还没有文件,就生成一个文件,count=0;
2,每次会话创建时, 从文件counter中取出 对象count=count+1;
3,保存计数器对象回文件中去。 考虑到,多个会话同时建立, 可能会A会话读出count=100;
b会话此时也读出count=100;
然后,a会话将101先写回文件;
b会话也将自己计算所得的101写回文件,这样就漏掉了一次会话的计数! 我想用文件锁定来锁定文件, 实现序列化/互斥 的读出和写入!
我使用了java.nio.channels.*包中的FileChannel和FileLock两个抽象类。
但是有一个问题:
FileLock的release()释放锁方法是一个抽象方法!
所以使用它就会出现异常!
我改用FileChannel的close()方法关闭。
但是,似乎并不能 释放文件锁!
因为, 我的计数器从此以后就没有增长过!
--------我的操作系统是windowsXP!
请 告诉我怎样实现文件锁定和释放, 或者告诉我哪些书详细介绍了文件锁定!
谢谢!
我要用一个 可序列化对象 ,将自己保存在文件中来实现 将计数器对象保存在文件中。
我的计数器是针对每一个 session就会加一。
具体方法是:
1,如果还没有文件,就生成一个文件,count=0;
2,每次会话创建时, 从文件counter中取出 对象count=count+1;
3,保存计数器对象回文件中去。 考虑到,多个会话同时建立, 可能会A会话读出count=100;
b会话此时也读出count=100;
然后,a会话将101先写回文件;
b会话也将自己计算所得的101写回文件,这样就漏掉了一次会话的计数! 我想用文件锁定来锁定文件, 实现序列化/互斥 的读出和写入!
我使用了java.nio.channels.*包中的FileChannel和FileLock两个抽象类。
但是有一个问题:
FileLock的release()释放锁方法是一个抽象方法!
所以使用它就会出现异常!
我改用FileChannel的close()方法关闭。
但是,似乎并不能 释放文件锁!
因为, 我的计数器从此以后就没有增长过!
--------我的操作系统是windowsXP!
请 告诉我怎样实现文件锁定和释放, 或者告诉我哪些书详细介绍了文件锁定!
谢谢!
然后就可以使用了如
fc.tryLock();
fc.lock();
查sun的jdk文档就可以了
FileLock 的release()方式是一个抽象方法!
一用那个方法就会出现异常!
所以同时会有无数的javabean对象,所以没有办法锁定对象! 事实上是一个线程就有
有一个对象, 锁定对象是没用的。
count记录数量 version记录版本
读取count的同时也读取version比如:
当前count=100 version =100
1 A 读取,然后count++ version++
先判断A.version > version(即101>100),成立,则写入
如果出现A.version = version 则不写入2 A B 同时读取,都是count++ version++
A先存入,这是,全局的count=101 version=101
B再存入时发现B.version=version,所以不插入(或者重新执行count++)这样不知道行不行这个方法好像叫 乐观锁机制
public class Handler implements Runnable {
private static List pools = new LinkedList();//保存未处理请求
private static boolean stop_flag = false;
public void run() {
while (!stop_flag) {
synchronized (pools) {
while (pools.isEmpty()) {
try {
pools.wait();
}
catch (InterruptedException e) {}
}
//do
}
}
} protected static void requestToHandler(Object object) {
synchronized (pools) {
pools.add(pools.size(), object);
pools.notifyAll();
}
}
}