2013-01-03 6 views
1

threadlocal 변수는 언제 사용해야합니까? 나는 여러 스레드를 실행하는 코드를 가지고 있습니다. 각 스레드는 S3에서 일부 파일을 읽고, 얼마나 많은 행이 파일 전체에서 읽었는지 추적하고 싶습니다. 내 코드는 다음과 같습니다여기서 ThreadLocal을 사용해야합니까?

final AtomicInteger logLineCounter = new AtomicInteger(0); 
for(File f : files) { 
    calls.add(_exec.submit(new Callable<Void>() { 
    @Override 
    public Void call() throws Exception { 
     readNWrite(f, logLineCounter); 
     return null; 
    } 
    })); 
} 
for (Future<Void> f : calls) { 
    try { 
     f.get(); 
    } catch (Exception e) { 
     // 
    } 
} 
LOGGER.info("Total number of lines: " + logLineCounter); 
... 

private void readNWrite(File f, AtomicInteger counter) { 
    Iterator<Activity> it = _dataReader.read(file); 

    int lineCnt = 0; 
    if (it != null && it.hasNext()) { 
     while(it.hasNext()) { 
     lineCnt++; 
     // write to temp file here 

     } 
     counter.getAndAdd(lineCnt); 
    } 
} 

내 질문의 ThreadLocal로 나는 readNWrite() 방법에 lineCnt을해야합니까입니까?

답변

2

없음 당신이 여기의 ThreadLocal를 사용할 필요가 없습니다 - 코드가 완벽하게 정상적으로 보이는 :

  • lineCnt 따라서 스레드간에 공유되지 않는 지역 변수 => 그것은 안전 스레드는
  • counter.getAndAdd(lineCnt);입니다입니다 원자 및 스레드 안전 작업

관심이 있으시면 this one과 같은 ThreadLocal 사용에 대한 게시물이 몇 가지 있습니다.

2

lineCnt은 스택에 있기 때문에 이미 "스레드 로컬"입니다. 인스턴스 구성원 변수의 스레드 로컬 사본이 필요한 경우에만 ThreadLocal을 사용하십시오.

1

lineCnt를 ThreadLocal으로 명시 적으로 지정하지 않아도됩니다. lineCnt은 스레드에 대한 로컬 변수입니다. 다른 스레드에서는 액세스 할 수 없습니다. (그 GET 또는 설정 방법을 통해)을 액세스하는 각 스레드가 있는지에 이러한 변수들의 정상 대조 다를 javadoc

에서의 ThreadLocal 대해 here

의 ThreadLocal 더 많은 정보를 얻을 수

그 자신의 독립적으로 초기화 된 변수 복사본입니다. 일반적으로 스레드

1

와 상태를 연관 지 으려고하는 클래스에서의 private static 필드입니다 의 ThreadLocal 인스턴스 -ThreadStack, RegisterProgram Counter 있습니다.

-lineCnt은 이미 ThreadLocal입니다.

-lineCnt이 스레드의 인스턴스 변수 lineCnt 의 개인적인 복사이며, 그 다른 스레드 보이지.