2017-10-11 8 views
1

학교용 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(); 

} 
+1

아마도 Object에서 동기화하는 것이 가장 쉽습니다. –

답변

2

그냥 보호 ReentrantLock와와 ReentrantReadWriteLock 사이의 차이가 더 파이가

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

전체 메서드 본문 처리량에 대한 세부적인 제어

ReentrantLock은 동기화 된 Java 모니터 잠금 기능과 동일한 기능을 수행합니다. 그것은 단지 기술적으로 다릅니다. 이 만큼 더 쓰기없기 때문에 병렬 읽 allowes 때문에

당신이 많은 이있는 경우

적은 읽기 쓰기 잠금을 사용 가치가 글을 읽습니다.

ReentrantLocks를 사용하는 경우 항상 try-finally 패턴을 따라 어떤 경우에도 잠금을 해제하십시오. 동기화가 필요하지 않습니다.

여기에 readWrite를 사용한 예제에서의 제안에 대한 제안. 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(); 
    } 
}