zoukankan      html  css  js  c++  java
  • java FileLock

    import java.nio.ByteBuffer;
    import java.nio.IntBuffer;
    import java.nio.channels.FileChannel;
    import java.nio.channels.FileLock;
    import java.io.RandomAccessFile;
    import java.util.Random;
    
    /**
     * Test locking with FileChannel. Run one copy of this code with arguments
     * "-w /tmp/locktest.dat" and one or more copies with "-r /tmp/locktest.dat" to
     * see the interactions of exclusive and shared locks. Note how too many readers
     * can starve out the writer. Note: The filename you provide will be
     * overwritten. Substitute an appropriate temp filename for your favorite OS.
     * 
     * Created April, 2002
     * 
     * @author Ron Hitchens (ron@ronsoft.com)
     */
    public class LockTest {
        private static final int SIZEOF_INT = 4;
        private static final int INDEX_START = 0;
        private static final int INDEX_COUNT = 10;
        private static final int INDEX_SIZE = INDEX_COUNT * SIZEOF_INT;
        private ByteBuffer buffer = ByteBuffer.allocate(INDEX_SIZE);
        private IntBuffer indexBuffer = buffer.asIntBuffer();
        private Random rand = new Random();
    
        public static void main(String[] argv) throws Exception {
            boolean writer = false;
            String filename;
    //        if (argv.length != 2) {
    //            System.out.println("Usage: [ -r | -w ] filename");
    //            return;
    //        }
            
            String temp[]={"-w","xxx.txt"};
            argv=temp;
            writer = argv[0].equals("-w");
            filename = argv[1];
            RandomAccessFile raf = new RandomAccessFile(filename, (writer) ? "rw"
                    : "r");
            FileChannel fc = raf.getChannel();
            LockTest lockTest = new LockTest();
            if (writer) {
                lockTest.doUpdates(fc);
            } else {
                lockTest.doQueries(fc);
            }
        }
    
        // ----------------------------------------------------------------
        // Simulate a series of read-only queries while
        // holding a shared lock on the index area
        void doQueries(FileChannel fc) throws Exception {
            while (true) {
                println("trying for shared lock...");
                FileLock lock = fc.lock(INDEX_START, INDEX_SIZE, true);
                int reps = rand.nextInt(60) + 20;
                for (int i = 0; i < reps; i++) {
                    int n = rand.nextInt(INDEX_COUNT);
                    int position = INDEX_START + (n * SIZEOF_INT);
                    buffer.clear();
                    fc.read(buffer, position);
                    int value = indexBuffer.get(n);
                    println("Index entry " + n + "=" + value);
                    // Pretend to be doing some work
                    Thread.sleep(100);
                }
                lock.release();
                println("<sleeping>");
                Thread.sleep(rand.nextInt(3000) + 500);
            }
        }
    
        // Simulate a series of updates to the index area
        // while holding an exclusive lock
        void doUpdates(FileChannel fc) throws Exception {
            while (true) {
                println("trying for exclusive lock...");
                FileLock lock = fc.lock(INDEX_START, INDEX_SIZE, false);
                updateIndex(fc);
                lock.release();
                println("<sleeping>");
                Thread.sleep(rand.nextInt(2000) + 500);
            }
        }
    
        // Write new values to the index slots
        private int idxval = 1;
    
        private void updateIndex(FileChannel fc) throws Exception {
            // "indexBuffer" is an int view of "buffer"
            indexBuffer.clear();
            for (int i = 0; i < INDEX_COUNT; i++) {
                idxval++;
                println("Updating index " + i + "=" + idxval);
                indexBuffer.put(idxval);
                // Pretend that this is really hard work
                Thread.sleep(500);
            }
            // leaves position and limit correct for whole buffer
            buffer.clear();
            fc.write(buffer, INDEX_START);
        }
    
        // ----------------------------------------------------------------
        private int lastLineLen = 0;
    
        // Specialized println that repaints the current line
        private void println(String msg) {
            System.out.print("
     ");
            System.out.print(msg);
            for (int i = msg.length(); i < lastLineLen; i++) {
                System.out.print(" ");
            }
            System.out.print("
    ");
            System.out.flush();
            lastLineLen = msg.length();
        }
    }
  • 相关阅读:
    HTML 与 HTML 页面之间动态传值的问题
    maven 导入本地项目(JQuery中的绝杀 $("表单").serialize() 可以自动提交表格数据)+邮件发送+通用的Servlet写法
    linux服务器nginx的卸载
    http协议
    所谓的批量删除
    查看本机ssh公钥,生成公钥
    centos7 redis5编译安装
    linux没有ll等命令的解决办法
    Linux 安装python3.7.0
    CentOS7 安装mysql
  • 原文地址:https://www.cnblogs.com/rojas/p/5421203.html
Copyright © 2011-2022 走看看