Synchronized methods should not be overridden with non-syncrhonized methods.
A parent class declared the method synchronized
, guaranteeing correct behavior when multiple threads access the same instance. All overriding methods should also be declared synchronized
, otherwise unexpected behavior may occur.
Example 1: In the following code, the class Foo
overrides the class Bar
but does not declare the method synchronizedMethod
to be synchronized
:
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
could be cast to type Bar
. If the same instance is given to two separate threads and synchronizedMethod
is executed repeatedly, the behavior will be unpredictable.[1] Sun Microsystems, Inc. Bug ID: 4294756 Javac should warn if synchronized method is overridden with a non synchronized