2014-03-14 6 views
0

인터뷰를 한 후 문장의 단어 수를 세는 함수를 작성하도록 요청했습니다. 이 함수는 스레드로부터 안전해야합니다. 다음 방법을 사용할 수 있습니까?자바에서 스레드 안전 함수를 사용하여 문장의 단어 수를 계산하십시오.

public static synchronized int find(String str){ 

    int count=0; 
    boolean word= false; 

    char[] ch = str.toCharArray(); 
    for(int i =0;i<ch.length;i++){ 
     if(!(ch[i]==' ')){ 
      for(int j=i;j<ch.length;j++,i++){ 
       if(!(ch[j]==' ')){ 
        word= true; 
        if(j==ch.length-1){ 
         count++; 
        } 
        continue; 
       } 
       else{ 
        if(word){ 
         count++; 
        } 
        word = false; 
       } 
      } 
     } 
     else{ 
      continue; 
     } 
    } 
    return count; 
} 
+4

함수를 스레드로부터 안전하게 만들려면 아무 것도하지 않아도됩니다. 공유 리소스에 액세스하지 않습니다. (인터뷰 질문의 취지가 아니기를 바란다. 나는 당신을 위해 그것을 망치고 싶지 않기 때문이다.) 그런데, ['String.split()'] (http://docs.oracle.com /javase/7/docs/api/java/lang/String.html#split(java.lang.String)). –

+4

이 스레드가 안전하지 않게하려면 거의 * 시도해야합니다. (지역 변수와 클래스 필드 사이의 구분을 이해하지 못하는 사람이 여기에 대해 정적 필드를 만들 수 있기 때문에 거의 말합니다.) – user2357112

+2

이 함수가 작동하는 것 같지만 인터뷰에 실패했을 가능성이 큽니다. 코드가 불필요하게 복잡하고 버그가 발생하기 쉽습니다. 이중 루프는 잔인했으며 내부 루프가 'i'를 수정한다는 사실은 매우 혼란 스럽습니다. 'j'는 중복됩니다. 사용 중일 때마다 'i'와 같은 값을 갖습니다. 메서드를 '동기화'로 표시하는 것은 불필요했습니다. 이 모든 일은 도서관 호출로 한 줄로 해결 될 수있었습니다. – user2357112

답변

2

모든 메소드의 변수/인스턴스가 로컬이고 매개 변수가 threadsafe 인 경우 메소드는 스레드 세이프입니다. ( 지역 변수가 없습니다)

이 될 것입니다 내 구현 : 여기에 플레이

public static int countWords(String str) { 
    return str.trim().split("\\s+").length; 
} 

유일한 객체는 String 매개 변수입니다. Java에서는 String이 변경 가능하지 않으므로 스레드 안전성을 가지므로이 구현은 스레드 안전합니다.


참고 : "로컬 변수"는 "로컬로 생성 된 개체에 대한 프리미티브 또는 참조를 유지하는 변수"를 의미합니다.

+0

@ruakh oops! 나는 그저 자신의 서명을 복사하여 붙여 넣었습니다. 제거되었습니다. 고마워. – Bohemian

+1

"메서드가 로컬 변수 만 사용하는 경우에는 스레드 안전입니다." - 오해의 소지가있는 진술. 로컬 변수와 다른 스레드의 로컬 변수가 동일한 객체를 참조하고 동시에 스레드 안전하지 않은 메서드를 호출하는 경우 코드가 스레드로부터 안전하지 않습니다. – user2357112

+0

@MichaelAndersonhmmm. 맞습니다. 나는 그 대답을 분명히했습니다. 기본적으로 * instances *가 로컬 인 경우 메서드가 스레드 세이프 일지 여부는 중요하지 않습니다. – Bohemian

관련 문제