- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:スレッドセーフなクラスのサブクラスは? synchronizedって継承先では?)
スレッドセーフなクラスのサブクラスは? synchronizedって継承先では?
このQ&Aのポイント
- メソッドにsynchronizedキーワードをつけた時、継承先のサブクラス側でもsynchronizedは生きているのでしょうか?
- もし生きていると、サブクラス側で、synchronizedを取り除きたい場合、synchronizedをつけない形でオーバーライドして中身の実装はsuper.メソッド名();だけにするという方法しかないということでしょうか?
- サブクラス側で、synchronizedキーワードを追加しながらメソッドのオーバーライドができるということを知っています。
- みんなの回答 (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() { ........ } } 外部からアクセスするメソッドと、オーバーライドされるメソッドを分けてしまえばよいわけです。
お礼
ありがとうございます。 大変参考になりました。