NIO相关基础篇二

本文深入探讨Java NIO的文件锁(FileLock)和Selector机制,介绍如何实现文件的共享和独占锁,并讲解Selector在非阻塞I/O中的作用,通过实例代码展示其用法。此外,文章还简单提及了AIO(异步I/O)的概念。
摘要由CSDN通过智能技术生成

转载请注明原创出处,谢谢!

上篇NIO相关基础篇一,主要介绍了一些基本的概念以及缓冲区(Buffer)和通道(Channel),本篇继续NIO相关话题内容,主要就是文件锁、以及比较关键的Selector,后续还会继续有一到二篇左右与NIO内容相关。

文件锁(FileLock)

在看RocketMQ源码中,发现有关于文件锁的import,但是具体使用代码里面注释调了[回头看看为什么,理解下,到时候会在某篇文章里进行说明](实现一个事情的方法很多,所以不一定就一种),但是为了知识的完整性,还是准备讲下文件锁,可能以后或者那个地方可以使用,或者大家在那里使用到都可以继续留言讨论。

文件锁和其他我们了解并发里面的锁很多概念类似,当多个人同时操作一个文件的时候,只有第一个人可以进行编辑,其他要么关闭(等第一个人操作完成之后可以操作),要么以只读的方式进行打开。

在java nio中提供了新的锁文件功能,当一个线程将文件锁定之后,其他线程无法操作此文件,文件的锁操作是使用FileLock类来进行完成的,此类对象需要依赖FileChannel进行实例化。

文件锁方式
- 共享锁:允许多个线程进行文件读取。
- 独占锁:只允许一个线程进行文件的读写操作。

备注:文件锁定以整个 Java 虚拟机来保持。但它们不适用于控制同一虚拟机内多个线程对文件的访问。
多个并发线程可安全地使用文件锁定对象。

Java文件依赖FileChannel的主要涉及如下4个方法:

方法|说明
|:——–:|:———:|
lock() |获取对此通道的文件的独占锁定。
lock(long position, long size, boolean shared) |获取此通道的文件给定区域上的锁定。
tryLock() throws IOException | 试图获取对此通道的文件的独占锁定。
tryLock(long position, long size, boolean shared) throws IOException | 试图获取对此通道的文件给定区域的锁定。
无|lock()等同于lock(0L, Long.MAX_VALUE, false)
无|tryLock()等同于tryLock(0L, Long.MAX_VALUE, false)

lock()

tryLock()

lock()和tryLock()的区别
- lock()阻塞的方法,锁定范围可以随着文件的增大而增加。无参lock()默认为独占锁;有参lock(0L, Long.MAX_VALUE, true)为共享锁。
- tryLock()非阻塞,当未获得锁时,返回null。无参tryLock()默认为独占锁;有参tryLock(0L, Long.MAX_VALUE, true)为共享锁。

简单实例代码:

File file = new File("d:" + File.separator + "test.txt") ;
FileOutputStream output = null ;
FileChannel fout = null ;
try {
    output = new FileOutputStream(file,true) ;
    fout = output.getChannel() ;// 得到通道
    FileLock lock = fout.tryLock() ; // 进行独占锁的操作
    if(lock!=null){
    System.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值