gpt4 book ai didi

java - 线程和进程之间的文件锁

转载 作者:搜寻专家 更新时间:2023-11-01 03:04:17 24 4
gpt4 key购买 nike

我正在编写一个程序,该程序从同一 JVM 上的不同线程和不同的 JVM/进程写入单个文件。有没有一种方法可以为线程和进程锁定一个文件,这样无论有多少线程/进程同时尝试写入,一次只能写入一个文件?

目前我有类似于以下的东西,它适用于锁定线程,但不适用于阻塞进程。如果我尝试在下面的实现之上使用 FileLock,它似乎 synchronized 停止工作。

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import scripts.com.adz.commons.utils.FileUtilities;

import java.io.*;

public class Foo {
public static void main(String[] args) throws IOException {
Bar bar = new Bar();
bar.start();

while (true) {
FileUtilities.writeObjectToFile("C:\\test.html", "foo");
}
}
}

class Bar extends Thread {
@Override
public void run() {
while (true) {
try {
FileUtilities.writeObjectToFile("C:\\test.html", "bar");
} catch (IOException ignored) {}
}
}
}

class FileUtilitiess {
private static final Object _lock = new Object();

public static <T> T readObjectFromFile(File file) throws IOException, ClassNotFoundException {
synchronized (_lock) {
final byte[] bytes = FileUtils.readFileToByteArray(file);

ByteArrayInputStream bis = null;
ObjectInputStream ois = null;

try {
ois = new ObjectInputStream(bis = new ByteArrayInputStream(bytes));

return (T) ois.readObject();
} finally {
IOUtils.closeQuietly(ois);
IOUtils.closeQuietly(bis);
}
}
}

public static void writeObjectToFile(File file, Object object) throws IOException {
System.out.println("Sent object: " + object.toString());
synchronized (_lock) {
System.out.println("Writing object: " + object.toString());

ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;

try {
oos = new ObjectOutputStream(bos = new ByteArrayOutputStream());
oos.writeObject(object);

FileUtils.writeByteArrayToFile(file, bos.toByteArray());

// - Start: For testing lock.
try {
Thread.sleep(10000);
} catch (InterruptedException ignored) {}
// - End: For testing lock.
} finally {
IOUtils.closeQuietly(oos);
IOUtils.closeQuietly(bos);
}
}
}
}

最佳答案

参见 FileLock javadoc :

File locks are held on behalf of the entire Java virtual machine.

这意味着在操作系统级别上,您的应用程序的不同线程将具有相同的访问锁定区域的权限。

要锁定来自不同线程的文件访问,您必须封装文件 IO 代码并强制执行同步。

关于java - 线程和进程之间的文件锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28113009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com