java I/O系统(7)-文件加锁

本文介绍了Java NIO中的文件锁机制,通过FileChannel和FileLock实现文件的加锁和解锁。讨论了独占锁和共享锁的区别,以及如何锁定文件的部分区域。还通过示例代码展示了阻塞式和非阻塞式加锁的区别,以及锁的释放方法。
摘要由CSDN通过智能技术生成

引言

在通道中我们可以对文件或者部分文件进行上锁。上锁和我们了解的线程锁差不多,都是为了保证数据的一致性。在文件通道FileChannel中可以对文件进行上锁,通过FileLock可以对文件进行锁的释放。在本篇博文中会详细介绍在NIO中对文件锁的操作与配置,同时给出对应demo。笔者目前整理的一些blog针对面试都是超高频出现的。大家可以点击链接:http://blog.csdn.net/u012403290

文件通道FileChannel

文件加锁是建立在文件通道(FileChannel)之上的,套接字通道(SockeChannel)不考虑文件加锁,因为它是不共享的。它对文件加锁有两种方式:
①lock


   public final FileLock lock() throws IOException {
        return lock(0L, Long.MAX_VALUE, false);
    }

   public abstract FileLock lock(long position, long size, boolean shared)
        throws IOException;

②tryLock

 public final FileLock tryLock() throws IOException {
        return tryLock(0L, Long.MAX_VALUE, false);
    }
 public abstract FileLock tryLock(long position, long size, boolean shared)
        throws IOException;

两种加锁方式默认都是对整个文件加锁,如果自己配置的话就可以控制加锁的文件范围:position是加锁的开始位置,size是加锁长度,shared是用于控制该锁是共享的还是独占的。
那么两个到底有什么区别呢?
lock是阻塞式的,当有进程对锁进行读取时会等待锁的释放,在此期间它会一直等待;tryLock是非阻塞式的,它尝试获得锁,如果这个锁不能获得,那么它会立即返回。
其实,这个锁的机制有点像多线程中的Lock锁,可以参考以前博文,其中有对synchronized与lock的比较(http://blog.csdn.net/u012403290/article/details/64910926

下面这段代码区别了这个其中的关系:

package com.brickworkers.io.nio;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.channels.FileLock;

/**
 * 
 * @author Brickworker
 * Date:2017年5月22日下午3:06:55 
 * 关于类LockingTest.java的描述:NIO文件加锁
 * Copyright (c) 2017, brcikworker All Rights Reserved.
 */
public class LockingTest {
   

    private static class MyThread extends Thread{
   
        private FileOutputStream fs;
        private boolean isTrylock;

        public MyThread(FileOutputStream fs, boolean isTrylock) {
            this.fs = fs;
            this.isTrylock = isTrylock;
        }
        @Override
        public void run() {
            try {
                //获取锁
                FileLock fl;
                if(isTrylock){
                    fl &#
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值