このインスタンスメソッドは、this.getClass()
で同期化しています。
このクラスがサブクラス化されるなら、サブクラスはおそらく意図したことではないサブクラスのためにクラスオブジェクトで同期化します。
たとえば、java.awt.Label の以下のコードを検討してください。
private static final String base = "label"; private static int nameCounter = 0; String constructComponentName() { synchronized (getClass()) { return base + nameCounter++; } }
Label
のサブクラスは同じサブクラスで同期化しません。データレースを生じさせます。
その代わりに、このコードは、Label.class
で同期化するべきです。
private static final String base = "label"; private static int nameCounter = 0; String constructComponentName() { synchronized (Label.class) { return base + nameCounter++; } }
Jason Mehrens によって寄贈されたバグパターン