1

静的変数とメソッドは、インスタンス (オブジェクト) ではなくクラスに属します。通常、それらはclassName.staticMethod()またはclassName.staticVariableを使用してアクセスされますが、 classInstance.staticMethod()classInstance.staticVariableなどのクラス インスタンスを使用してアクセスまたは呼び出すこともできます。

私の最初の質問は

そもそもクラスインスタンスを介した静的メソッド/関数へのアクセスを許可するのはなぜですか? ユースケースはありますか?

次の質問は次のとおりです。次のクラスを考えてください

public class Counter{
private static int count = 0;

public static synchronized int getCount()
{
  return count;
}

public synchronized setCount(int count)
{
   this.count = count;
}

}

これらの関数が以下のように呼び出される場合、マルチスレッド環境で

Counter myCounter = new Counter();
myCounter.setCount(10);
System.out.println(myCounter.getCount());

2問目は

両方の関数が別々のロックを持っているか、同じロックを持っていますか (両方とも myCounter オブジェクトによって呼び出されることを考慮して)? スレッド処理の静的メソッドがまだクラスレベルのロックを取得している場合、どのロックを取得する必要があるかを内部的にどのように把握しますか?

4

2 に答える 2

4

質問1 : クラスのインスタンスは常にクラスの情報を持っているため、インスタンスから static メソッドを呼び出すことはクラスに関する情報を持っているため有効です。クラスにはそのインスタンスに関する情報がないため、他の方法は不可能です。そのため、クラス名を使用してインスタンスレベルのメソッドを呼び出すことはできません。

インスタンスを介して静的メソッドを呼び出そうとすると、回避する必要があるため警告が表示されるため、有効なケースは得られませんが、インスタンスを介した静的呼び出しを許可するのは論理的です。

質問2 : 2 番目の質問に進みます。スレッドが静的ブロックまたはメソッドに入った瞬間、jvm はどのロックを取得するか、つまりクラス レベルを認識します。ユーザーはそれを制御できません。そのため、インスタンス メソッドはオブジェクト ロックを取得し、静的メソッドはクラス ロックを取得します。これは、呼び出しの方法に関係なく、スレッドがその上で動作するためです。

于 2013-06-09T06:27:57.290 に答える
0

Q1: 次のリンクを読むことができます

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Q2: まず、2 番目のメソッドは、静的として宣言する必要があるという警告を表示します。それ以外の場合、フィールドは静的であってはなりません。彼らは絶対に異なるロックを持っています。インスタンス メソッドにはオブジェクト ロックがあり、静的オブジェクトにはクラス レベル ロックがあります

于 2013-06-09T06:49:23.640 に答える