如何添加锁以从文件方法读取和写入

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();
  }
}