5

以下counterに、Java クラスの静的変数を示します。

問題は、この変数がいつリセットされるかです。たとえば、プログラムを再起動すると、コンピューター. リセットできる他のシナリオは何ですか?

もう 1 つの質問は、関数 do() が実行される回数よりもこの変数の増加が少ない理由は何でしょうか? たとえば、クラスの複数のプロセスを開始すると何かjava Whateverでしょうか? それとも、複数のスレッド/サーバーなどを備えたものでしょうか?

class Whatever {

    static int counter = 0;

    function do() {
        counter++;
        //...
    }

}

追加の質問: 複数のスレッドが関数 do() を実行する場合、カウンター変数はどのように動作しますか? 関数 do() が実行された回数よりも少なくなりますか?

4

7 に答える 7

2

アプリケーションを再起動すると、静的変数が再初期化されます。

于 2012-11-22T11:09:09.633 に答える
2

JLSによると:

フィールドが静的であると宣言されている場合、クラスのインスタンスが最終的にいくつ (場合によってはゼロ) 作成されるかに関係なく、フィールドの具体化は 1 つだけ存在します。クラス変数と呼ばれることもある静的フィールドは、クラスが初期化されるときに具体化されます。

これで最初の質問に答えます。つまり、クラスがロードされた正確な時間:)

2番目の質問によると、いいえ。変数がプライベートと宣言されている場合。その場合、カプセル化のため、唯一のアクセスはメソッド経由です。

静的変数は、JVM がシャットダウンされるまで存続します。

于 2012-11-22T11:09:13.120 に答える
0
class Foo { // in same package
public static void main(String[] args) {
    Whatever w = new Whatever();
    for (int i = 0; i < 1000; i++) {
        w.do();
    }
    Whatever.counter = -1;
}

ここdo()では1000回呼び出されcounterますが、最後に値があります。

do()はあなたの例であなたのように使用しましたが、それはdo whileループのキーワードであるため、有効なメソッド名ではないことに注意してください。

于 2012-11-22T11:15:10.227 に答える
0

静的変数は、プログラムの実行中にそのフィールドのインカネーションが1つしかないことを意味します。クラスが初期化されるときにロードされます。

2番目の質問では、複数のスレッドが同時に変数にアクセスできるため、変数はスレッドセーフではありません。カウンターが揮発性であったとしても、並行性の問題に直面します。例と要件を考えると、3つのオプションがあります。

唯一の要件が変数を操作することであり、コードの残りの部分がそれに依存しない場合は、同期(大砲でハエを殺す)またはAtomicInteger(パフォーマンスの高い選択)を使用できます。

static synchronize int counter = 0;
// or
static AtomicInteger counter = new AtomicInteger();

コードの残りの部分がカウンターに依存している場合は、ロックオブジェクトを使用するか、メソッドを同期する必要があります。

class Whatever {

    static int counter = 0;

    synchronize function do() {
        counter++;
        if(counter < 10){
            //  do something
        }
    }
}

//  or

class Whatever {

    static int counter = 0;
    static final Object _lock = new Object();

    function do() {
        synchronized (_lock) {
            counter++;
            if(counter < 10){
                //  do something
            }
        }
    }
}

これは今私の頭の中にあるオプションですが、おそらくもっとあります。

于 2012-11-22T12:05:02.923 に答える