单机上多JVM同步控制的一种方法(3)

/**
     * @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();的测试这里就不在给出具体的情况了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyzwxp.html