请教怎样进行文件锁定!  
    我要用一个 可序列化对象  ,将自己保存在文件中来实现  将计数器对象保存在文件中。
  我的计数器是针对每一个 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!
   请  告诉我怎样实现文件锁定和释放,  或者告诉我哪些书详细介绍了文件锁定!
         谢谢!

解决方案 »

  1.   

    FileChannel fc = new FileInputStream("test.txt").getChannel();
    然后就可以使用了如
    fc.tryLock();
    fc.lock();
    查sun的jdk文档就可以了
      

  2.   

    问题是怎么释放文件锁!
       FileLock 的release()方式是一个抽象方法!
     一用那个方法就会出现异常!
      

  3.   

    但是,我的javabean对象是放在session里的, 用于记录session发生的次数。
      所以同时会有无数的javabean对象,所以没有办法锁定对象!  事实上是一个线程就有
    有一个对象,  锁定对象是没用的。
      

  4.   

    你可以用这个方法实现一下,不知道对你是不是有帮助在文件里设置 count 和 version 两个变量
    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++)这样不知道行不行这个方法好像叫 乐观锁机制
      

  5.   

    象下面的类,只要所有javabean计数的时候都访问request方法就ok了。至于怎么写在run方法里面可以进行。
    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();
            }
        }
    }
      

  6.   

    参考贴:http://community.csdn.net/Expert/topic/4159/4159878.xml?temp=.3731195