`
lengyingxin
  • 浏览: 57343 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程使用LockFIle,每个线程Lock一部分文件

阅读更多
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class LockFiles {

    static final int   LENGTH = 1000000;
    static FileChannel fc ;

    public static void main(String[] args) throws Exception {

        File file = new File("D://in.txt");
        FileOutputStream fo = new FileOutputStream(file);//可使用OutputStream和RandomAccessFile,使用InputStream会抛出异常NonWritableChannelException 

        fc  = fo.getChannel();
        ByteBuffer out = ByteBuffer.allocate(LENGTH);

        for (int i = 0; i < LENGTH; i++)

            out.put((byte)( 'i'+i));

        new LockAndModify(out, 0, 0 + LENGTH / 4);

        new LockAndModify(out, LENGTH / 3, LENGTH / 3 + LENGTH / 4);

    }

 

    private static class LockAndModify extends Thread {

        private ByteBuffer buff;

        private int        start, end;

 

        LockAndModify(ByteBuffer mbb, int start, int end) {

            this.start = start;

            this.end = end;

            mbb.limit(end);

            mbb.position(start);

            buff = mbb.slice();

            start();

        }

        
        public void run() {

            try {
                FileLock fl = fc.lock(start, end, false);

                System.out.println("The Buffer Locked: " + start + " to " + end);


                while (buff.position() < buff.limit() - 1){
                   	buff.put((byte) (buff.get() + 1));
                   	}
                fl.release();

                System.out.println("The Buffer Released: " + start + " to " + end);

            } catch (IOException e) {

                throw new RuntimeException(e);

            }

        }

    }

}


运行结果如下:The Buffer Locked: 333333 to 583333
The Buffer Locked: 0 to 250000
The Buffer Released: 333333 to 583333
The Buffer Released: 0 to 250000
如果两个线程的锁定重叠就会抛出如下异常:Exception in thread "Thread-1" java.nio.channels.OverlappingFileLockException
0
0
分享到:
评论
1 楼 hejianmingwshjmcj 2012-09-07  
不知道应用到什么场景

相关推荐

    php 多线程上下文中安全写文件实现代码

    提供一个php多线程上下文中安全写文件的实现方法。这个实现没有使用php 的file lock机制,使用的是临时文件机制。多线程中的各个线程都是对各自(每个线程独占一个)的临时文件写,然后再同步到原文件中。

    API之网络函数---整理网络函数及功能

    GetFileVersionInfoSize 针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区 GetFullPathName 获取指定文件的完整路径名 GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母 ...

    Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法

    废话不多说,直接上代码吧! import threading import os class Find(threading.Thread): #搜索数据的线程类 def __init__(self,datalist,startIndex,endIndex,searchstr,savefile): #datalist要搜索的内容列表,...

    mysql数据库my.cnf配置文件

    当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用, # 然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在...

    Ruby 多线程的潜力和弱点分析

    但由于存在 Ruby GIL (Global Interpreter Lock),MRI Ruby 并不能真正利用多线程进行并行计算。JRuby 去除了 GIL,是真正意义的多线程,既能应付 IO Block,也能充分利用多核 CPU 加快整体运算速度。 上面说得比较...

    PHP基于文件锁解决多进程同时读写一个文件问题示例

    用flock在写文件前先锁上,等写完后解锁,这样就实现了多线程同时读写一个文件避免冲突。大概就是下面这个流程 /* *flock(file,lock,block) *file 必需,规定要锁定或释放的已打开的文件 *lock 必需。规定要使用哪...

    java 面试题 总结

    Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应...

    超级有影响力霸气的Java面试题大全文档

    Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应...

    lockfs:lockfs包装了一个absfs文件系统,并向每个文件系统和文件方法添加了互斥锁lockunlock

    lockfs-absfs.FileSystem的线程安全包装器lockfs FileSystem只是使用互斥锁“锁定/解锁”来包装absfs接口的所有方法,从而使文件和文件系统线程安全。 这是一个很好的简单示例,说明了如何通过absfs.FileSystems的...

    C# 3.0完全自学宝典 (F)

    示例描述:介绍.NET多线程实现。 UseTrhead 演示普通线程的使用实例 UseParaThread 演示带参数线程的使用实例 UseLock 演示使用lock语句同步数据实例 UseMonitor 演示使用Monitor类同步数据实例 UseMutex 演示...

    flock:Go中的线程安全文件锁定库(最初为github.comtheckmango-flock)

    它还包括一个非阻塞的TryLock()函数,以允许锁定而不会阻塞执行。执照flock是根据BSD 3-条款许可发布的。 有关更多详细信息,请参见LICENSE文件。兼容该程序包使用了Go 1.7中引入的context程序包。 因此,该...

    一个进程池的服务器程序

    4,子进程每accept到一个请求都告诉父进程,父进程把请求数加1;子进程没完成一个请求,父进程把请求数减1;当父进程发现请求数 &gt;= 子进程数时,父进程创建新的子进程,并把子进程数加1(当然子进程数有个预先上限)...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...

    ARM_Linux启动分析.pdf

    init程序需要读取/etc/inittab文件作为其行为指针,inittab是以行为单位的描述性(非执行性)文本,每一个指令行都具有以下格式: id:runlevel:action:process其中id为入口标识符,runlevel为运行级别,action为...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    java面试宝典

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    千方百计笔试题大全

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    Oracle9i的init.ora参数中文说明

    小数分隔符用来将一个数字的整数部分与小数部分分隔开。其格式是 &lt;decimal_character&gt;&lt;group_separator&gt;。 值范围: 任何单字节字符, '+', '-', ', '&gt;' 除外。 默认值: 从 NLS_TERRITORY 中获得 nls_sort: 说明: ...

Global site tag (gtag.js) - Google Analytics