如何添加锁以从文件方法读取和写入
How to add locks to read and write from file methods
我必须为学校的 readFromFile() 和 writeToFile() 方法添加锁。请查看下面的方法代码,并告诉我在代码中的什么位置放置锁?我会使用 ReentrantLock 还是 ReadWriteReentrantLock?我们必须使用锁。
谢谢。
读取方法
public static void readFromFile(List<Person> people)
{
FileReader fr = new FileReader("names");
Scanner sc = new Scanner(fr);
while (sc.hasNext()) {
String name = sc.nextLine();
int age = Integer.parseInt(sc.nextLine());
people.add(new Person(name, age));
}
sc.close();
}
写法
public static void writeToFile(List<Person> people)
{
File outputFile = new File (List<Person> people)
PrintWriter pw = new PrintWriter(outputFile);
for (Person p: people) {
pw.println(p.name); }
pw.close();
}
只保护整个方法体
static ReadWriteLock rwl = new ReentrantReadWriteLock();
public static void readFromFile(List<Person> people) {
rwl.readLock().lock();
try {
...
//method body is not changed
} finally {
rwl.readLock().unlock();
}
}
public static void writeToFile(List<Person> people) {
rwl.writeLock().lock();
try {
...
//method body is not changed
} finally {
rwl.writeLock().unlock();
}
}
ReentrantLock 和 ReentrantReadWriteLock 的区别在于对吞吐量的控制更细粒度。
ReentrantLock 与 java 监视器锁定具有相同的功能。这只是技术上的不同。
如果您有很多读取而写入较少,则值得使用读写锁,因为它允许并行读取 只要因为没有写入。
如果您使用 ReentrantLocks,请始终遵循 try-finally 模式 以在任何情况下释放锁。同步不需要。
此处建议使用 readWrite 在您的示例中进行读取。写入方法是一样的,只是使用 writeLock()。
private static final ReentrantReadWriteLock readWriteLock = new readWriteLock;
public static void readFromFile(List<Person> people) {
readWriteLock.readLock().lock();
try {
// method body
} finally {
readWriteLock.readLock().unlock();
}
}
我必须为学校的 readFromFile() 和 writeToFile() 方法添加锁。请查看下面的方法代码,并告诉我在代码中的什么位置放置锁?我会使用 ReentrantLock 还是 ReadWriteReentrantLock?我们必须使用锁。
谢谢。
读取方法
public static void readFromFile(List<Person> people)
{
FileReader fr = new FileReader("names");
Scanner sc = new Scanner(fr);
while (sc.hasNext()) {
String name = sc.nextLine();
int age = Integer.parseInt(sc.nextLine());
people.add(new Person(name, age));
}
sc.close();
}
写法
public static void writeToFile(List<Person> people)
{
File outputFile = new File (List<Person> people)
PrintWriter pw = new PrintWriter(outputFile);
for (Person p: people) {
pw.println(p.name); }
pw.close();
}
只保护整个方法体
static ReadWriteLock rwl = new ReentrantReadWriteLock();
public static void readFromFile(List<Person> people) {
rwl.readLock().lock();
try {
...
//method body is not changed
} finally {
rwl.readLock().unlock();
}
}
public static void writeToFile(List<Person> people) {
rwl.writeLock().lock();
try {
...
//method body is not changed
} finally {
rwl.writeLock().unlock();
}
}
ReentrantLock 和 ReentrantReadWriteLock 的区别在于对吞吐量的控制更细粒度。
ReentrantLock 与 java 监视器锁定具有相同的功能。这只是技术上的不同。
如果您有很多读取而写入较少,则值得使用读写锁,因为它允许并行读取 只要因为没有写入。
如果您使用 ReentrantLocks,请始终遵循 try-finally 模式 以在任何情况下释放锁。同步不需要。
此处建议使用 readWrite 在您的示例中进行读取。写入方法是一样的,只是使用 writeLock()。
private static final ReentrantReadWriteLock readWriteLock = new readWriteLock;
public static void readFromFile(List<Person> people) {
readWriteLock.readLock().lock();
try {
// method body
} finally {
readWriteLock.readLock().unlock();
}
}