반응형

 하나의 자원에 동시다발적으로 여러 프로세스가 접근해서 컨트롤을 하게 되는 경우가 생긴다. 이러한 점들로 인해 프로그램이 교착상태, 경쟁조건 및 기타 등등의 오류가 발생할 수 있다.


 처음에 코딩을 할 때 아무 생각없이 바로 File Delete 를 실행했었는데, 생각해보면 동시에 해당 파일에 접근할 수 있다는 생각을 하지 않고 코딩을 했다. 나중에 들어온 사용자가 먼저 들어온 사용자보다 먼저 작업을 해버리면 파일이 꼬여버리게 된다. 이러한 상태를 방지하기 위한 코딩방법이다.


 1. 동기화 구문을 통해 한번에 하나의 스레드만 공유자원(예:파일)에 접근 가능하도록 해야한다.

 2. 필요 없는 부분은 구문으로 감싸지 않아 성능에 최대한 영향이 적도록 한다.


일반적으로 


File file = new File(URL);

if(file.exist()){

file.delete();

}


이렇게 파일이 이미 생성이 존재하는 상태라면 파일을 삭제하는 명령어를 사용할텐데, 저렇게하면 안전하지 않다. 


똑같은 삭제를 하더라도 아래와같이


File file = new File(URL);


if(file.exist()){

FileDelete(file);

}


//Delete 동기화 함수 사용

private synchronized void FileDelete(File file){

file.delete();

}


이러한 방식으로 사용을 한다면 TOCTOU 문제 없이 안정적으로 코딩을 진행할 수 있다.


※ 다중 Thread로 공유자원에 접근을 할 때에는 Thread safe 함수를 사용하자.


반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기