2013-04-14 6 views
28

私はスーパークラスPointと​​メソッドdraw()を持っています。 Pointのサブクラスは、draw()メソッドをオーバーライドすると​​を継承するのですか、それとも常に書き込む必要がありますか?同期はJavaで継承されていますか?

+0

ことができ、重複しました方法](http://stackoverflow.com/questions/10173345/overriding-a-synchronized-method) – Raedwald

答えて

28

いいえ、あなたはいつも​​と書く必要があります。スーパークラスのsynchronizedメソッドを呼び出すと、これはもちろん同期呼び出しになります。​​はメソッドシグネチャの一部ではありません。

詳細については、Javaスレッディングボス(Doug Lea、Java Threading Boss)の説明を参照のこと。http://gee.cs.oswego.edu/dl/cpj/mechanics.htmlを参照してください。

+2

特定のメソッド呼び出しが同期化されているかどうかは、静的型ではなく呼び出されたオブジェクトの動的型によって異なります。つまり 'foo()'が 'Derived'では' synchronized'で 'Base'では同期されておらず、' Base'変数に 'Derived'を割り当てて' foo() 'を呼び出すと、その呼び出しは同期させる。この点は、言語仕様の8.4.3.6( 'synchronized'メソッドはそのメソッド内の' synchronized'ステートメントと同等です)では暗黙的ですが、他の場所ではそれが見つからないことがあります。実行可能なデモ[ここ](http://runnable.com/U4zBThIj5WNju2g2/)。 – mrec

4

オーバーライドメソッドは、オーバーライドして​​を削除すると、が同期化されなくなります。見つけたherehere

+1

いずれの引用も規範的な参照ではありません。 – EJP

10

あなたはこれを書き込むことによって、それを自分でチェックすることができます。

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

+2

テストが簡単な方法は、['Thread.holdsLock(this);'](http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#holdsLock% 28java.lang.Object%29)オーバーライドされたメソッド –

+4

質問に答えません。テストコードは、同期以外の何らかの原因でバグや時間の異常が発生する可能性があります。その答えは言語仕様にあります。 – EJP

+0

@EJP最初はあなたが間違っていると思った。それから、あなたが本当に正しいと気づいたのですが、むしろ悲観的でした... – Timo

関連する問題