티스토리 뷰

반응형

 

 

 

가. 원인

  - 병렬실행 환경에서 공유자원의 검사시점과 사용시점의 공유자원의 상태가 달라 오작동을 일으키는 경우

 

 

나. 영향

  - 프로그램이 교착상태 발생

  - 경쟁자원의 변조나 삭제 등을 통해 동기화 오류 발생

 

 

다. 보안대책

  - 경쟁자원에 여러 스레드가 접근 시 동기화 사용

  - 동기화 구문(Synchronized)을 이용하여 한번에 하나의 스레드만 접근하도록 구현

  - 동기화 구문은 임계코드 주변에만 적용

 

 

라. 안전한 코드

1. 동기화 구문 사용

 

  class FileManager extends Thread {

     private static final String SYNC = "SYNC";

     private String mode = "READ";

 

     public FileManager( String mode ){

        this.mode = mode.toUpperCase();

     }

     ...

     public void run() {

        // 파일의 읽기와 쓰기가 동시에 사용될 경우 동기화 오류를 방지하기 위해 동기화 구문 사용

        synchronized( SYNC ) {

           File f = new File( "/readFile.txt" );

           if ( f.exist() ){ 

              if ( this.mode.equals( "READ" ) ){

                 BufferedReader br = new BufferedReader( new FileReader( f ) );

                 ...

              } else if { this.mode.equals( "DELETE" } ) {

                 f.delete();

              }

           }

        }

     }

  }

 

 

 

마. 진단방법

<동기화 처리 확인>

  1. 멀티스레드 환경에서 공유자원을 사용하는지 확인

  2. 하나의 자원에 동시접근 시 문제가 되는 자원인지 확인

  3. 동기화 구문을 적용하였는지 확인

 

 

바. 정/오탐 케이스

<정탐 케이스>

  1. C언어에서 하나의 공유자원을 동시 접근이 가능할 경우

 

<오탐 케이스>

  1. Java에서 스트림 생성할 때 IOException을 발생시키며, 이에 대한 적절한 처리를 하고 있을 경우

  2. 실제로 경쟁조건이 이루워지지 않을 경우

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday