louzin
6 months ago
4 changed files with 112 additions and 0 deletions
@ -0,0 +1,47 @@
|
||||
# FileLock |
||||
在OS中很常见,用来避免多个程序同时修改同一个文件造成的不同步问题 |
||||
|
||||
给一个文件加锁,同一时间只有一个程序能修改此文件 |
||||
|
||||
**文件锁是进程级别的,不是线程级别的** |
||||
|
||||
文件锁可以解决多个进程之间的不同步,但不能解决多线程的问题 |
||||
|
||||
文件锁是JVM持有的,一但获取到文件锁,要调用 |
||||
- release() |
||||
- 关闭FileChannel对象 |
||||
- JVM退出 |
||||
|
||||
才会释放这个锁 |
||||
|
||||
## 分类 |
||||
|
||||
### 排他锁 |
||||
独占锁,仅该进程可操作,其他进程不能操作,直至释放锁 |
||||
### 共享锁 |
||||
其他进程仅可读,直到释放锁,是线程安全的 |
||||
|
||||
```java |
||||
import java.io.FileOutputStream; |
||||
import java.nio.channels.FileChannel; |
||||
|
||||
FileChannel fileChannel = new FileOutputStream("./1.txt").getChannel; |
||||
File lock = fileChannel.lock(); |
||||
lock.release(); |
||||
``` |
||||
## 获取文件锁的方法 |
||||
- lock():排他锁 |
||||
- lock(long position,long size,boolean shared):第一、二个参数表示加锁位置,第三个参数表示是否为共享锁 |
||||
- tryLock():排他锁 |
||||
- tryLock(long position,long size,boolean shared):自定义锁,若指定共享锁,则其他进程只读,若尝试写入会抛出异常 |
||||
|
||||
### lock & trylock |
||||
- lock:阻塞 |
||||
- trylock:非阻塞,获取成功返回当前对象,否则为null |
||||
|
||||
## 其他方法 |
||||
### boolean isShared() |
||||
### boolean isValid() |
||||
此文件锁是否还有效 |
||||
|
||||
在某些os上对某个文件枷锁后,不能对该文件使用通道映射 |
@ -0,0 +1,28 @@
|
||||
# Pipe |
||||
Java NIO管道是线程之间的单向数据连接 |
||||
|
||||
Pipe有一个source和一个sink通道,数据会写到sink,从source读取 |
||||
|
||||
## Pipe CRUD |
||||
```java |
||||
public void createPipe() throws IOException { |
||||
//Get Pipe |
||||
Pipe open = Pipe.open(); |
||||
//Get sink Pipe |
||||
Pipe.SinkChannel sink = open.sink(); |
||||
//Get Buffer |
||||
ByteBuffer allocate = ByteBuffer.allocate(1024); |
||||
//write into sink Pipe |
||||
allocate.put("louzin".getBytes(StandardCharsets.UTF_8)); |
||||
allocate.flip(); |
||||
sink.write(allocate); |
||||
//Get source Pipe |
||||
Pipe.SourceChannel source = open.source(); |
||||
//create Buffer and read source Pipe |
||||
ByteBuffer allocate1 = ByteBuffer.allocate(1024); |
||||
int length = source.read(allocate1); |
||||
allocate1.flip(); |
||||
System.out.println(new String(allocate1.array(),0,length)); |
||||
//close Pipe |
||||
} |
||||
``` |
@ -0,0 +1,5 @@
|
||||
package com.louzin.niodemo.filelock; |
||||
|
||||
public class fileLockCRUD { |
||||
|
||||
} |
@ -0,0 +1,32 @@
|
||||
package com.louzin.niodemo.pipe; |
||||
|
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
import java.io.IOException; |
||||
import java.nio.ByteBuffer; |
||||
import java.nio.channels.Pipe; |
||||
import java.nio.charset.StandardCharsets; |
||||
|
||||
public class pipecrud { |
||||
@Test |
||||
public void createPipe() throws IOException { |
||||
//Get Pipe
|
||||
Pipe open = Pipe.open(); |
||||
//Get sink Pipe
|
||||
Pipe.SinkChannel sink = open.sink(); |
||||
//Get Buffer
|
||||
ByteBuffer allocate = ByteBuffer.allocate(1024); |
||||
//write into sink Pipe
|
||||
allocate.put("louzin".getBytes(StandardCharsets.UTF_8)); |
||||
allocate.flip(); |
||||
sink.write(allocate); |
||||
//Get source Pipe
|
||||
Pipe.SourceChannel source = open.source(); |
||||
//create Buffer and read source Pipe
|
||||
ByteBuffer allocate1 = ByteBuffer.allocate(1024); |
||||
int length = source.read(allocate1); |
||||
allocate1.flip(); |
||||
System.out.println(new String(allocate1.array(),0,length)); |
||||
//close Pipe
|
||||
} |
||||
} |
Loading…
Reference in new issue