返回信息流从网上看到两种文件锁,请教大牛解释一下。
1. FileLock lock = new RandomAccessFile(fileName, "rw").getChannel().tryLock();
lock.release();
2.ReadWriteLock机制
不太明白这两者的区别。
还有一个问题,对同一个文件读写的时候,读操作可以并发么?带我的人说不可以,网上有说可以的。。。求教原因和分析。
我现在就是多进程多线程对同一个文件读写,有一个类专门放了若干个读写的方法,如果用文件锁的话用上面哪个机制比较好??
这是一条镜像帖。来源:北邮人论坛 / java / #26499同步于 2013/8/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
多线程文件读写问题
fredwade
2013/8/4镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
1.是调用操作系统的文件锁,具体读操作可不可以并发好像是和操作系统有关的(这个记不清楚了,lz可以自己查下)。
2.是Java内部的读写锁,这个是可以并发读的。
如果lz实在多个虚拟机进程里需要并发的处理这个文件应该只能用1吧。
但是好像1是不保证同一个虚拟机内的线程可以互斥的~
=。=好像有点乱
大概就是说1是告诉操作系统我这个进程占用了文件,其它进程不能碰。
而2是在某个jvm进程内,一个线程告诉该jvm内的其他线程不能占用该文件。
【 在 fredwade 的大作中提到: 】
: 从网上看到两种文件锁,请教大牛解释一下。
: 1. FileLock lock = new RandomAccessFile(fileName, "rw").getChannel().tryLock();
: lock.release();
: ...................
不能既互斥其他进程又互斥本进程内的线程吗
【 在 aiquestion 的大作中提到: 】
: 1.是调用操作系统的文件锁,具体读操作可不可以并发好像是和操作系统有关的(这个记不清楚了,lz可以自己查下)。
: 2.是Java内部的读写锁,这个是可以并发读的。
: 如果lz实在多个虚拟机进程里需要并发的处理这个文件应该只能用1吧。
: ...................
刚搜了下:
http://blog.csdn.net/gxy3509394/article/details/7435993
这个地方说【单个 Java 虚拟机在某个特定文件上所保持的锁定是不重叠的,即同一个jvm中不同线程去拿同一文件的锁时,先拿到的获得锁,后获取的无法获得锁,tryLock()方法不会抛出异常,但获得锁值为null。】
这个具体我就不太清楚了,lz自己试一下吧。
【 在 fredwade 的大作中提到: 】
: 不能既互斥其他进程又互斥本进程内的线程吗
呵呵这个博客我也看过了。。。
【 在 aiquestion 的大作中提到: 】
: 刚搜了下:
: http://blog.csdn.net/gxy3509394/article/details/7435993
: 这个地方说【单个 Java 虚拟机在某个特定文件上所保持的锁定是不重叠的,即同一个jvm中不同线程去拿同一文件的锁时,先拿到的获得锁,后获取的无法获得锁,tryLock()方法不会抛出异常,但获得锁值为null。】
: ...................
为啥不用一个线程来读写这个文件,然后设置缓冲队列来存储其他线程要对文件的操作和内容。
=。=猜不出哪个场景需要多个虚拟机进程里的多个线程去并发读写文件的。。。lz要不介意能说一下应用场景么?
【 在 fredwade 的大作中提到: 】
: 呵呵这个博客我也看过了。。。
是安卓系统里,手机装了多个app,每个app同时启动多个线程调用接口向服务器发起请求,然后用tomcat处理请求并存储一些东西,所有的请求需要在同一个文件里进行读写操作,而且有很多个读写接口,读写不同的内容,用的是DOM。
【 在 aiquestion 的大作中提到: 】
: 为啥不用一个线程来读写这个文件,然后设置缓冲队列来存储其他线程要对文件的操作和内容。
: =。=猜不出哪个场景需要多个虚拟机进程里的多个线程去并发读写文件的。。。lz要不介意能说一下应用场景么?
文件操作都是在同一个tomcat的服务端内进行的?那就是在同一个jvm进程里吧……
【 在 fredwade 的大作中提到: 】
: 是安卓系统里,手机装了多个app,每个app同时启动多个线程调用接口向服务器发起请求,然后用tomcat处理请求并存储一些东西,所有的请求需要在同一个文件里进行读写操作,而且有很多个读写接口,读写不同的内容,用的是DOM。
( ⊙ o ⊙ )好像是我理解错了.....
【 在 fredwade 的大作中提到: 】
: 是安卓系统里,手机装了多个app,每个app同时启动多个线程调用接口向服务器发起请求,然后用tomcat处理请求并存储一些东西,所有的请求需要在同一个文件里进行读写操作,而且有很多个读写接口,读写不同的内容,用的是DOM。
嗯。。对同一个TOMCAT应该是同一个进程。。。应该是线程间互斥就可以。。。我之前也是想迷了没表达清楚。另外,这种多请求过来的话,TOMCAT侧IO读写也是在不同线程里吧?是不是也要互斥?有什么机制?
【 在 aiquestion 的大作中提到: 】
: ( ⊙ o ⊙ )好像是我理解错了.....