• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:スレッドセーフなクラスのサブクラスは? synchronizedって継承先では?)

スレッドセーフなクラスのサブクラスは? synchronizedって継承先では?

このQ&Aのポイント
  • メソッドにsynchronizedキーワードをつけた時、継承先のサブクラス側でもsynchronizedは生きているのでしょうか?
  • もし生きていると、サブクラス側で、synchronizedを取り除きたい場合、synchronizedをつけない形でオーバーライドして中身の実装はsuper.メソッド名();だけにするという方法しかないということでしょうか?
  • サブクラス側で、synchronizedキーワードを追加しながらメソッドのオーバーライドができるということを知っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

1) 生きています。というのも、 synchronized void method() { ........ } というメソッドは、 void method() { synchronized (this) { ........ } } というメソッドと同じように解釈されるからです。 2) 残念ながら、そうすることはできません。サブクラスのメソッドはシンクロナイズされていなくても、スーパークラスのメソッドはシンクロナイズされていますので、結局意味がありません。 synchronizedの宣言をサブクラスのメソッドで取り消すには、メソッドのコード全体を再び書く必要があります。 4) (1)の答えが「生きている」でも危険性はありますよ。(2)の方法を使えばシンクロナイゼーションを解除できるわけですから。 ですから、いずれにしても、スーパークラス作成者あるいはサブクラス作成者がへまをやると、スレッドアンセーフになってしまいます。 もちろん、スーパークラス作成者が下のような「テクニック」を使えば、サブクラス作成者がへまをすることはなくなります。 class SampleClass {    public final synchronized void method() {   methodImpl();  }    protected void methodImpl() {   ........  }   } 外部からアクセスするメソッドと、オーバーライドされるメソッドを分けてしまえばよいわけです。

lawson
質問者

お礼

ありがとうございます。 大変参考になりました。

関連するQ&A