界: Code Quality

コードの質が低いと、予測できない動作につながります。ユーザーの視点には、それがしばしば使い勝手の悪さとなって現れます。攻撃者にとっては、予期せぬ方法でシステムにストレスを与える機会となります。

Code Correctness: Non-Synchronized Method Overrides Synchronized Method

Abstract
同期化されたメソッドを、同期化されていないメソッドで上書きするべきではありません。
Explanation
メソッド synchronized を宣言した親クラスは、複数のスレッドが同じインスタンスにアクセスするときに、正しい動作を保証します。すべての上書きメソッドを、synchronized として宣言する必要があります。そうしないと、予期せぬ動作が発生する可能性があります。

例 1: 次のコードでは、クラス Foo がクラス Bar を上書きしていますが、メソッド synchronizedMethodsynchronized に宣言していません。


public class Bar {
public synchronized void synchronizedMethod() {
for (int i=0; i<10; i++) System.out.print(i);
System.out.println();
}
}

public class Foo extends Bar {
public void synchronizedMethod() {
for (int i=0; i<10; i++) System.out.print(i);
System.out.println();
}
}


この場合、Foo のインスタンスが、タイプ Bar にキャストされる可能性があります。同じインスタンスが 2 つのスレッドに指定されており、synchronizedMethod が繰り返し実行される場合、動作が予期できなくなります。
References
[1] Sun Microsystems, Inc. Bug ID: 4294756 Javac should warn if synchronized method is overridden with a non synchronized
[2] TSM00-J. Do not override thread-safe methods with methods that are not thread-safe CERT
[3] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1
[4] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 2
[5] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[6] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
desc.structural.java.code_correctness_non_synchronized_method_overrides