1、FileChannel写文件真的并发安全吗?比如在一个jvm进程中,多个线程可以使用一个FileChannel来写,是线程安全的。如果有多个jvm进程怎么办?这个时候没有办法保证多个线程按顺序写文件,并发写文件还是有可能出问题;2.如何避免多个jvm进程写入文件造成的数据错误FileChannelfilesLock,可以给文件加锁,共享锁,排他锁,如果文件是共享锁,那么你可以读文件,其他人可以读文件,其他人也可以加锁共享锁,如果是排他锁,只有加锁线程才能读写文件,排他锁和共享锁是互斥的;底层是通过调用Linux的fnctl从内核锁定文件来实现的;3.demoRandomAccessFilein=newRandomAccessFile("/Users/long/demo.txt","rw");FileChannelchannel=in.getChannel();//文件独占锁,只能由加锁线程读写FileLocklock=channel.lock(0,Integer.MAX_VALUE,false);System.out.println("文件加排他锁成功");//共享文件锁,允许多个线程一起读取/*FileLocklock=channel.lock(0,Integer.MAX_VALUE,true);System.out.println("文件共享锁成功");*/System.out.println(channel.read(ByteBuffer.allocate(100)));//释放锁lock.release();线程.sleep(60*60*1000);通道关闭();附寄();四、Trylock和锁方法tryLock()是非阻塞的,它尝试获取锁,但是如果获取不到,例如因为其他一些进程已经持有了相同的锁而没有共享时,它将直接从方法调用返回。lock()是阻塞的,它阻塞进程直到锁可用,或者调用lock()的线程被中断,或者调用lock()的通道被关闭。五、共享锁和排他锁的区别排他锁:也称为排他锁,如果一个线程获得了一个文件的排他锁,那么其他线程就不能再获得对同一个文件的排他锁或共享锁,直到排他锁被解除释放。其他线程不能读写;共享锁:如果一个线程获得了一个文件的共享锁,其他线程可以获得同一个文件的共享锁或者同一个文件的部分共享锁,但是不能获得排它锁,其他线程只能读不能读写。
