私はスーパークラスPoint
とメソッドdraw()
を持っています。 Point
のサブクラスは、draw()
メソッドをオーバーライドするとを継承するのですか、それとも常に書き込む必要がありますか?同期はJavaで継承されていますか?
答えて
いいえ、あなたはいつもと書く必要があります。スーパークラスのsynchronizedメソッドを呼び出すと、これはもちろん同期呼び出しになります。はメソッドシグネチャの一部ではありません。
詳細については、Javaスレッディングボス(Doug Lea、Java Threading Boss)の説明を参照のこと。http://gee.cs.oswego.edu/dl/cpj/mechanics.htmlを参照してください。
特定のメソッド呼び出しが同期化されているかどうかは、静的型ではなく呼び出されたオブジェクトの動的型によって異なります。つまり 'foo()'が 'Derived'では' synchronized'で 'Base'では同期されておらず、' Base'変数に 'Derived'を割り当てて' foo() 'を呼び出すと、その呼び出しは同期させる。この点は、言語仕様の8.4.3.6( 'synchronized'メソッドはそのメソッド内の' synchronized'ステートメントと同等です)では暗黙的ですが、他の場所ではそれが見つからないことがあります。実行可能なデモ[ここ](http://runnable.com/U4zBThIj5WNju2g2/)。 – mrec
あなたはこれを書き込むことによって、それを自分でチェックすることができます。
public class Shape {
protected int sum = 0;
public synchronized void add(int x) {
sum += x;
}
}
public class Point extends Shape{
public void add(int x) {
sum += x;
}
public int getSum() {
return sum;
}
}
とテストクラス私のマシン上で
public class TestShapes {
public final static int ITERATIONS = 100000;
public static void main(String[] args) throws InterruptedException {
final Point p = new Point();
Thread t1 = new Thread(){
@Override
public void run() {
for(int i=0; i< ITERATIONS; i++){
p.add(1);
}
}
};
Thread t2 = new Thread(){
@Override
public void run() {
for(int i=0; i< ITERATIONS; i++){
p.add(1);
}
}
};
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(p.getSum()); // should equal 200000
}
}
それは137099の代わりに、同期オーバーライド[の200000
テストが簡単な方法は、['Thread.holdsLock(this);'](http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#holdsLock% 28java.lang.Object%29)オーバーライドされたメソッド –
質問に答えません。テストコードは、同期以外の何らかの原因でバグや時間の異常が発生する可能性があります。その答えは言語仕様にあります。 – EJP
@EJP最初はあなたが間違っていると思った。それから、あなたが本当に正しいと気づいたのですが、むしろ悲観的でした... – Timo
- 1. @継承されたアノテーションは継承されていません
- 2. ジニのJava継承はサポートされていますか?
- 3. クラス継承が期待どおりに継承されない
- 4. PostgreSQLの継承:親テーブルの引き金は継承されていますか?
- 5. Javaで継承されていない同じパッケージ内で、protectedにアクセスできるのはなぜですか?
- 6. メソッドの属性はC#で継承されていますか?
- 7. 継承はビューでサポートされていますか?
- 8. 友人関係はC++で継承されていますか?
- 9. jquery mobile - データのロールは同じタグに継承されていますか?
- 10. 継承されたクラスはネストされたクラスを継承しますか?
- 11. 同期メソッドの継承とオーバーライド
- 12. toStringメソッドは、arrayListから継承されています。
- 13. dunderメソッドは継承されていますか?
- 14. 静的変数は継承されていますか?
- 15. Gradle - プロガード設定は継承されていますか?
- 16. autofac複数のクラスが同じインターフェースから継承されています
- 17. JS ECMAScript 6でコンストラクタが継承されていますか?
- 18. Java 8は複数の継承をサポートしていますか?
- 19. 継承されたロジックとカスタムロジックを継承したC#継承メソッド - これは可能ですか?
- 20. Java ORM:複数(継承)継承
- 21. カスタム属性クラスは継承されたAttributeUsageフラグを継承しますか?
- 22. 同じ継承コードはjavaとC++で異なって動作します
- 23. クラス継承java
- 24. java継承メソッド
- 25. Java継承/コンストラクタ
- 26. Javaレストコンストラクタ継承
- 27. Java継承
- 28. Java継承TextArea
- 29. 同じクラス内でメソッドを継承する方法は? JAVA
- 30. JPA継承 - 親は子で削除されていません
ことができ、重複しました方法](http://stackoverflow.com/questions/10173345/overriding-a-synchronized-method) – Raedwald