庖丁解牛:NIO核心概念与机制详解 05 _ 文件锁定

news2024/11/24 17:20:35

文章目录

  • Pre
  • 概述
  • 锁定文件 (lock)
  • Code
  • 文件锁定和可移植性

在这里插入图片描述


Pre

庖丁解牛:NIO核心概念与机制详解 01

庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现

庖丁解牛:NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片

庖丁解牛:NIO核心概念与机制详解 04 _ 分散和聚集


概述

文件锁定初看起来可能让人迷惑。它似乎指的是防止程序或者用户访问特定文件。

事实上,文件锁就像常规的 Java 对象锁 ― 它们是 劝告式的(advisory) 锁。它们不阻止任何形式的数据访问,相反,它们通过锁的共享和获取赖允许系统的不同部分相互协调。

我们可以锁定整个文件或者文件的一部分。

  • 如果你获取一个排它锁,那么其他人就不能获得同一个文件或者文件的一部分上的锁。
  • 如果你获得一个共享锁,那么其他人可以获得同一个文件或者文件一部分上的共享锁,但是不能获得排它锁。

文件锁定并不总是出于保护数据的目的。例如,你可能临时锁定一个文件以保证特定的写操作成为原子的,而不会有其他程序的干扰

大多数操作系统提供了文件系统锁,但是它们并不都是采用同样的方式。有些实现提供了共享锁,而另一些仅提供了排它锁。事实上,有些实现使得文件的锁定部分不可访问,尽管大多数实现不是这样的。

在本节中,我们将学习如何在 NIO 中执行简单的文件锁过程,我们还将探讨一些保证被锁定的文件尽可能可移植的方法。


锁定文件 (lock)

要获取文件的一部分上的锁,我们需要调用一个打开的 FileChannel 上的 lock() 方法。

注意,如果要获取一个排它锁,我们必须以写方式打开文件

RandomAccessFile raf = new RandomAccessFile( "usefilelocks.txt", "rw" );
FileChannel fc = raf.getChannel();
FileLock lock = fc.lock( start, end, false );

在拥有锁之后,我们可以执行需要的任何敏感操作,然后再释放锁:

lock.release();

在释放锁后,尝试获得锁的其他任何程序都有机会获得它。


Code

UseFileLocks.java 必须与它自己并行运行。这个程序获取一个文件上的锁,持有5秒钟,然后释放它。如果同时运行这个程序的多个实例,我们会看到每个实例依次获得锁。


import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class UseFileLocks {
    static private final int start = 10;
    static private final int end = 20;

    static public void main( String args[] ) throws Exception {
        // Get file channel
        RandomAccessFile raf = new RandomAccessFile( "usefilelocks.txt", "rw" );
        FileChannel fc = raf.getChannel();

        // Get lock
        System.out.println( "trying to get lock" );
        FileLock lock = fc.lock( start, end, false );
        System.out.println( "got lock!" );

        // Pause
        System.out.println( "pausing" );
        try { Thread.sleep( 5000 ); } catch( InterruptedException ie ) {}

        // Release lock
        System.out.println( "going to release lock" );
        lock.release();
        System.out.println( "released lock" );

        raf.close();
    }
}

文件锁定和可移植性

文件锁定可能是一个复杂的操作,特别是考虑到不同的操作系统是以不同的方式实现锁这一事实。

下面的指导原则将帮助您尽可能保持代码的可移植性:

  • 1)只使用排它锁;
  • 2)将所有的锁视为劝告式的(advisory)
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1229920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

calibre更新 环境变量设置

我这里是从别的地方copy过来的calibre,所以不用安装。 如果需要安装请参考: Caibre2022.3_17版本安装及遇到问题 - 梅希的日志 - EETOP 创芯网论坛 (原名:电子顶级开发网) -将copy过来的calibre放在原来calibre的位置。 打开工作路径下的.b…

【Vue】Vue3 超简单拖拽条动态修改容器宽度

demo 代码 const leftBoxWidth ref(200); // 默认宽度 const leftResize (e: MouseEvent) > {const startX e.clientX;const startWidth leftBoxWidth.value;const mouseMove (documentE: MouseEvent) > {// 80 是左侧菜单宽度leftBoxWidth.value startWidth docu…

不懂找伦敦银趋势?3个方法搞定

趋势是我们的朋友,但是这个朋友却很喜欢跟我们开玩笑,如果我们不留意,根本发觉不了它的存在。怎么找到趋势本体并且和它做个好朋友呢?下面我们就来介绍三个方法。 数波段的高点和低点。我们以当前的市场波动价格为轴,向…

快手运营的必备的10个工具

一、引言 快手作为短视频领域的佼佼者,为众多创作者提供了广阔的舞台。要想在快手运营中取得成功,掌握一些必备的工具是必不可少的。本文将为您介绍快手运营的10个必备工具,帮助您提高工作效率,优化内容创作。 二、工具推荐 1. …

现货白银MACD实战分析例子

MACD这个技术指标的全称是平滑异同移动平均线,主要表示经过平滑处理后均线的差异程度,一般用来研判现货白银价格变化的方向、强度和趋势。MT4中的MACD指标,主要是由信号线、(上升/下跌)动能柱、0轴这三部分组成。 MACD…

键盘映射笔记

dumpkeys命令用于显示当前系统中定义的键盘映射表。它可以帮助用户查看和理解系统中的键盘布局和键盘映射规则。 当用户执行dumpkeys命令时,它会读取系统中的键盘映射表文件(通常是/etc/keymaps或/etc/console/boottime.kmap.gz),…

chatglm-6B模型下载

从huggingface上面下载chatglm-6B模型是比较简捷的方式,下面记录一下下载安装过程。 huggingface的官方文档如下: https://huggingface.co/docs/huggingface_hub/v0.14.0.rc1/guides/download 1.配置conda环境 服务器上使用的是miniconda,…

如何在公网环境下使用笔记本的Potplayer访问本地群晖webdav中的影视资源

文章目录 如何在公网环境下使用笔记本的Potplayer访问本地群晖webdav中的影视资源**那么问题来了,potplayer只能局域网内访问资源,那我不在家中怎么看本地电影?** 本教程解决的问题是:按照本教程方法操作后,达到的效果…

什么是域欺骗?域欺骗的主要类型有哪些?

域欺骗是指网络犯罪分子假冒网站名称或电子邮件域来欺骗用户。域欺骗的目的是将恶意电子邮件或网络钓鱼网站伪装成合法电子邮件或网站,诱使用户与之交互。域欺骗就像骗子一样,向人们展示伪造的凭据以获得信任,然后再利用其获得好处。 域欺骗…

【PCB学习】几种接地符号

声明 该图并非原创,原文出处不可考,因此在这里附加说明。 示意图

在vue-cli中快速使用webpack-bundle-analyzer

webpack-bundle-analyzer 是一个可视化资源分析工具,可以直观地分析打包出的文件有哪些,及它们的大小、占比情况、各文件 Gzip压缩后的大小、模块包含关系、依赖项等。 从vue-cli官方的更新记录可以看到,从vue-cli3开始集成report命令 当前环…

IIC总线逻辑

一、 我们习以为常的IIC通常是什么样子? 在我们研发/应用工程师眼中,IIC的形象通常是如图这样的吧?(你们说是不是?) 是的,对于理想的硬件调程序,这个层…

利用JDBC及Servlet实现对信息录入注册功能的实现

利用JDBC及Servlet实现对登录注册功能的实现; 1.题目要求: 1、新建一个数据库名为(个人姓名拼音),表(学生所在城市),字段(sid:学号,sname&#x…

如何通过cpolar内网穿透工具实现远程访问本地postgreSQL

文章目录 前言1. 安装postgreSQL2. 本地连接postgreSQL3. Windows 安装 cpolar4. 配置postgreSQL公网地址5. 公网postgreSQL访问6. 固定连接公网地址7. postgreSQL固定地址连接测试 前言 PostgreSQL是一个功能非常强大的关系型数据库管理系统(RDBMS),下…

vue中使用echarts渐变柱状图 Cannot read properties of undefined (reading ‘graphic‘)解决方法

在使用渐变颜色时报错,Cannot read properties of undefined (reading ‘graphic’) echarts也下载了,引入了,就是报错,用不了new charts, 结果换了一个版本号就可以了,本来用的"echarts": "…

win10家庭版系统远通过一根网线程连接另一台机器

用网线连接两个机器 打开cmd命令行 输入ipconfig,查看 复制 IPv4地址 打开 远程桌面 程序 点击连接 输入在另外一机器设置好的用户名和密码即可

CMMI之项目管理类核心框架

项目管理类过程域涵盖了与项目的计划、监督和控制相关的项目管理活动。 CMMI-DEV 中的七个项目管理类过程域是: • 集成项目管理(Integrated Project Management, IPM) • 项目监督与控制(Project Monitoring and Cont…

【Ant Design合集】自用总结

a-input 1. search 与 pressEnter 的设计区别 search 是与a-input-search绑定一起的,点击按钮和回车触发事件,关联有: enter-button:是否确认按钮(与addon自定义按钮冲突) loading:搜索loadin…

简单好用的轻量级思维导图:ClickCharts 激活for mac

ClickCharts是一款流程图和流程图绘制软件,它提供了直观的界面和丰富的工具,帮助用户轻松创建和编辑各种类型的图表和流程图。 以下是ClickCharts软件的一些主要功能和特点: 流程图绘制:ClickCharts允许用户创建各种类型的流程图…

直流充电桩测试仪的作用

直流充电桩测试仪主要用于对充电桩进行全面的功能测试和性能评估,以确保其正常运行和安全使用。直流充电桩测试仪可以对充电桩的各个功能进行测试,包括连接性测试、通信测试、充电功率测试等。通过测试可以检测充电桩是否正常工作,是否能够正…