测试&思考:
环境:windows 七、linux centos 6.三、java8html
java多线程同时写一个文件
java高并发环境下多线程同时写入一个文件时,
经过 FileLock 加锁,能够控制对文件的并发操做。同一个JVM,能够共享部份内存java
第一种状况是:一个线程A有对文件加锁,另外一个线程B没对文件加锁
在windows7环境下:(持有锁的能够写文件成功)。
持有锁的线程A会有对文件的操做权限,没加锁的线程B没有对文件的操做权限,会报错退出,以下:linux
java.io.IOException: 另外一个程序已锁定文件的一部分,进程没法访问。
在linux centos 6.3环境下:(均可以写文件成功,表现为数据交叉写入)
互不影响,线程A和B都有对文件的操做权限web
第二种状况两个线程都有加锁
在windows7环境和linux centos 6.3环境下表现同样:(持有锁的能够写文件成功)
一个线程A竞争到锁,会有对文件的操做权限,另外一个线程B没有竞争到锁,没有对文件的操做权限,会报错退出,而不是发生阻塞。以下:shell
java.nio.channels.OverlappingFileLockException
在高并的这种生产状况下,须要捕获这个异常,并处理,以下:windows
while (true) {
try {
flout = fcout.tryLock();
break;
} catch (Exception e) {
//计数等其余操做...
sleep(1000);
}
}
多进程同时写一个文件
若是同为java进程,则是不一样的JVM。不能够共享内存centos
若是同为java进程,一个进程A有对文件加锁,另外一个进程B没对文件加锁
在windows7环境下:(持有锁的能够写文件成功)。
持