Thread 크리티컬 세션

JAVA/Thread|2016. 12. 21. 22:56

쓰레드가 같은 부분을 공유하여


멀티프로세스보다 훨씬 좋은 장점을 가지고 있다 


그러나 그 만큼 같은 부분을 공유하기 때문에 


문제가 생기는 경우가 있다.


그래서 해당 쓰레드가 그 부분을 사용하고 있다면 


다른 쓰레드가 접근할 수 없도록 하는 동기화 작업이 필요하다.



Log를 남기는 작업을 하는 프로그램을 살펴보자


import java.io.*;

import java.util.*;


public class LogFile{

private Writer out;


public LogFile(File f) throws IOException{

 FileWriter fw = new FileWriter(f);

 this.out = new VufferedWriter(fw);

}


public void writeEntry(String message) throws IOException{

    Date d = new Date();

    out.write(d.toString());

    out.write('\t');

    out.write(message);

    out.write("\r\n");

}


public void close() throws IOException{

   out.flush();

   out.close();

}

}



위에 코드를 보면 알겠지만 하나의 쓰레드가 로그를 작성하던 중 다른 쓰레드가 out 메소드를 사용하여 로그 기록이 섞일 수 있는 문제가 발생할 수 도 있다 


이런 부분을 방지하기위해서


동기화 작업을 진행해보자.


1. out 객체를 동기화

public void writeEntry(String message) throws IOException{

synchronized(out){  

  Date d = new Date();

    out.write(d.toString());

    out.write('\t');

    out.write(message);

    out.write("\r\n");

}

}



              2. Log File객체 자체를 동기화 하는 방법

public void writeEntry(String message) throws IOException{

synchronized(this){  

  Date d = new Date();

    out.write(d.toString());

    out.write('\t');

    out.write(message);

    out.write("\r\n");

}

}


일반적으로 동기화를 할 때 객체의 메소드 자체에 대한 동기화를 많이 사용하며, 자바에서는 객체의 메소드를 동기화를 많이 사용한다.


3. 메소드를 동기화

public synchronized void writeEntry(String message) throws IOException{

  Date d = new Date();

    out.write(d.toString());

    out.write('\t');

    out.write(message);

    out.write("\r\n");

}


그러나 이런 메소드 동기화는 문제가 발생 할 수 도 있다.


첫째. 많은 가상 머신에서 심각한 성능 저하가 발생할 수 있다.


둘째 . 데드락이 발생할 가능성이 높아진다.


셋째. 동시 변경이나 접근으로 부터 보호하기 위해 항상 객체 자체를 보호해야하는 것은 아니며 해당 메소드를 포함한 클래스의 인스턴스를 동기화 해도 실제 보호해야 하는 객체를 보호하지 못할 수도 있다. 예를 들어 위 예제에서는 두 스레드가 동시에 out에 쓰는 상황을 막아야 한다. 만약에 LogFile과 관련없는 클래스에서 out을 참조할 경우 이런 시도는 동괴화를 깨트리게 된다.

'JAVA > Thread' 카테고리의 다른 글

synchronized 쓰레드 예제 프로그래밍  (0) 2016.12.21
Thread wait(), notify() 소개  (0) 2016.12.21
Thread 크리티컬 세션  (0) 2016.12.21
java thread pool 소개  (0) 2016.12.21
JAVA 스레드 스케줄링  (0) 2016.12.21
Thread 동기화 문제  (0) 2016.12.21

댓글()