2009-12-14 4 views
0

String 풀이 메소드가 완료되면 로컬 문자열을 버렸다고 믿었습니다.문자열 풀이 지역 변수를 사용합니까?

그러나

public class TestPool implements Runnable{ 

    /** 
    * @param args the command line arguments 
    */ 
    public void run() { 
     String str= "hello"; 
     synchronized(str){ 

      try { 
       System.out.print(Thread.currentThread().getName()); 
       Thread.sleep(500); 
       System.out.print(Thread.currentThread().getName()); 
      } 

      catch(InterruptedException e){ 

      } 

     } 
     } 
     public static void main(String []args){ 
      new Thread(new TestPool(),"A").start(); 
      new Thread(new TestPool(),"B").start(); 
     } 
    } 

whizlabs 가이드에 따르면이 코드는 로컬 문자열을 기준으로 해당 스레드를 동기화하고 있습니다. 출력은 항상 AABB 또는 BBAA입니다. 왜? str String이 지역 선언보다 오래 지속되는 이유는 무엇입니까?

답변

3

str의 로컬 선언이 모두 동일한 interned String 리터럴 인 "hello"를 가리 키기 때문에. 인턴 된 문자열은 상수이며 풀에서 관리됩니다. 그들은 전형적인 라이프 사이클을 가지지 않기 때문에 더 이상 참조가 없을 때 쓰레기를 모으지 않습니다.

는 선언 그것은 문자열 풀 로컬 변수를 복용 것이 아니다 (문자열은 불변이므로)는 "hello" 한 번만 저장 및 재사용되는 것을의

String str = new String("hello"); 
2

str은 범위가 정의 된 run() 메서드로 제한되는 로컬 변수입니다. 다른 스레드의 경우 str이 달라야합니다. 그러나

, 일정한 컴파일 시간으로서, 되면, 문자열 "안녕하세요"에 해당 다른 로컬 str의 지점 모두을 구금. 즉, 내용이있는 String의 단일 인스턴스가 풀에서 생성되고 동일한 문자 행을 가리키는 모든 요소가 동일한 객체를 가리키게됩니다.

마치 이러한 String의 정적 인스턴스를 만든 것입니다.

+0

+1 "(업데이트 중) - 바로 돌아 오십시오!" –

+0

나는 그것을 더 자주 써야만한다 :) 나의 마지막 텍스트가 또한 투표에 도움이되기를 희망한다. –

+0

참조가 로컬 변수이지만 가리키는 String이 아닙니다. 선언을 String str = new ("hello")로 변경할 때 어떤 일이 일어나는 지보십시오. – andandandand

3

예, str은 로컬 변수이지만 문자열 풀을 가리 킵니다. 두 번의 연속 메소드 호출에서 str은 풀의 동일한 위치를 가리키고 있으므로 동일한 객체에서 계속 동기화됩니다. 코드가

String str = new String("hello"); 

라면

당신은 참으로 로컬 객체에 동기화됩니다.

0

된 경우 경우가 아닐 것입니다.

동기화 된 블록 내에서 이것을 시도하면 두 스레드가 동일한 값을 인쇄하여 동일한 개체를 가지고 있음을 나타냅니다.

System.out.println(str.hashCode()); 
+0

나는 너 자신을 모순이라고 생각한다. "hello"String은 String 풀에 저장됩니다. 저장을위한 다른 곳은 없습니다. – andandandand

+0

hashCode는 동일한 Object를 테스트 할 때 신뢰할 수 없습니다. ... 1) 서로 다른 String은 같은 hashCode ("10"과 "0O")가 될 수 있습니다 ... 2) 동일한 내용 (a.equals (b))을 갖는 2 개의 별개의 String (a! = b) 같은 해시 코드 –

관련 문제