0

私は2つのクラスを持っています。クラスTestとクラスApplication。クラスimplements Runnableをテストし、スレッドです..もちろん。

どちらのクラスにも public static void main があります。

初め:

Testまず、クラスレベル変数「a」があるクラスを起動します

public static String a = "abc";

これは文字列オブジェクトを指しており、スレッドの内部では、新しい値を割り当ててその値を出力しているだけです。

第二に:

Applicationメインメソッドもあるクラスを起動し、Static Stringクラス内を印刷したところTest、驚くべきことに「abc」が印刷されました。クラスの開始後に2番目のクラスを開始したことに注意してくださいTest。理想的にはNULL、すべてのプロセスが実行され、1 つのプロセスが他のプロセスにアクセスしてはならない Java Sandbox のために、それを出力する必要があります。

今私の質問はなぜですか?新しく割り当てられた文字列を出力してはならない理由。以下の両方のクラスを提供しています

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);

    }
}
4

1 に答える 1

3

各プロセスには、静的フィールドの独自のコピーがあります。

ただし、各プロセスはクラス初期化子も実行するため、フィールドの各コピーは に初期化されabcます。

于 2013-10-22T14:34:27.570 に答える