2013-10-22 3 views
0

두 클래스가 있습니다. 클래스 Test 및 클래스 Application. 테스트 클래스 implements Runnable 그리고 물론 스레드입니다.정적 문자열 conundrum 수수께끼 행동

두 클래스 모두 public static void main이 있습니다.

첫째 :

먼저 나는 클래스 수준 변수가있는 Test 클래스를 실행 "A"

문자열 객체와 내가 스레드 내부 지적
public static String a = "abc"; 

그냥 새로운 값을 지정하고 그 값을 출력하는 것입니다. 둘째

는 :

또한 주요 방법이 있고 난 그냥 클래스 TestStatic String을 인쇄 놀랍게도이 "ABC"를 인쇄 나의 Application 클래스를 시작합니다. 내 Test 수업을 시작한 후 두 번째 수업을 시작했습니다. 이상적으로는 모든 프로세스가 실행되고 하나의 프로세스가 다른 프로세스에 액세스하지 않아야하는 Java Sandbox로 인해 NULL을 인쇄해야합니다.

내 질문이 여기에 있습니다. 왜 새로운 지정 문자열을 인쇄해서는 안됩니다. 내가

import java.util.Date; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

/** 
* 
* @author AZ 
*/ 
public class Test implements Runnable { 

    public static String a = "abc"; 


    @Override 
    public void run(){ 

     while(true){ 
      System.out.println(a); 
      a = new Date().toString(); 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     }  
    } 
} 
class ThreadRunner { 
    static public void main(String args[]){ 
     new Thread(new Test()).start(); 
    } 
} 

두 번째 클래스 아래

import com.springhibernate.beans.MessageBean; 
import com.springhibernate.beans.Test; 
import org.springframework.beans.factory.annotation.Autowired; 

/** 
* 
* @author AZ 
*/ 
public class Application { 


    public static void main(String args[]){ 


     System.out.println("Test of printing String " + Test.a); 

    } 
} 

답변

3

각 프로세스를 두 클래스를 제공하고하면 정적 필드의 복사본을 가지고있다.

그러나 각 프로세스도 클래스 초기화 도구를 실행하므로 필드의 각 복사본은 abc으로 초기화됩니다.

+0

정적 클래스가있는 경우 복수 실행시 두 번로드해야 함을 의미합니다. –

+0

제언을 권해주십시오. 나는 JVM과 관련된 것들에 대해 더 알고 싶다. –