example - ¿Está sincronizado heredado en Java?
table swing java (3)
No, siempre tendrá que escribir synchronized
. Si llama al método sincronizado de la súper clase, esta será, por supuesto, una llamada sincronizada. synchronized
no es parte de la firma del método.
Consulte http://gee.cs.oswego.edu/dl/cpj/mechanics.html para obtener una descripción detallada de Doug Lea, Java threading boss (más o menos).
Tengo superclase Point
y un método synchronized
draw()
. ¿Las subclases de Point
heredarán synchronized
si anulo el método draw()
en ellas o tengo que escribirlas siempre?
Puede verificarlo usted mismo escribiendo esto:
public class Shape {
protected int sum = 0;
public synchronized void add(int x) {
sum += x;
}
}
public class Point extends Shape{
public void add(int x) {
sum += x;
}
public int getSum() {
return sum;
}
}
Y clase de prueba
public class TestShapes {
public final static int ITERATIONS = 100000;
public static void main(String[] args) throws InterruptedException {
final Point p = new Point();
Thread t1 = new Thread(){
@Override
public void run() {
for(int i=0; i< ITERATIONS; i++){
p.add(1);
}
}
};
Thread t2 = new Thread(){
@Override
public void run() {
for(int i=0; i< ITERATIONS; i++){
p.add(1);
}
}
};
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(p.getSum()); // should equal 200000
}
}
En mi máquina era 137099 en lugar de 200000.
su método Overriden ya no se sincronizará si lo reemplaza y elimina el synchronized
. Lo encontré here y here