代码之家  ›  专栏  ›  技术社区  ›  AndroidBeginner

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

  •  1
  • AndroidBeginner  · 技术社区  · 7 年前

    我必须为学校的readFromFile()和writeToFile()方法添加锁。请查看下面的方法代码,并建议我在代码中的什么位置放置锁?我会使用ReentrantLock还是ReadWriterEntrantLock?我们必须使用锁。

    非常感谢。

    读取方法

    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();
    
    }
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   mlecz    7 年前

    只需守护整个法身

     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();
        }
      }
    
        2
  •  2
  •   Sorontur    7 年前

    ReentrantLock和ReentrantReadWriteLock之间的区别在于对吞吐量进行了更精细的控制。

    ReentrantLock与使用synchronized的java监视器锁定具有相同的功能。这只是技术上的不同。

    如果你有 写操作更少,值得使用读写锁,因为它允许 并行读取 只要有 无写入 .

    如果使用可重入锁定,请始终遵循 在任何情况下都要把锁打开。对于synchronized,这是不需要的。

    这里有一个关于readWrite示例中的read的建议。write方法相同,只需使用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();
      }
    }