У меня есть метод superclass Point
и synchronized
draw()
. Будут ли подклассы Point
наследовать synchronized
, если я переопределяю метод draw()
в них или я должен всегда писать его?
Синхронизировано ли унаследовано в Java?
Ответ 1
Нет, вам всегда придется писать synchronized
. Если вы вызовете синхронизированный метод суперкласса, это, конечно же, будет синхронизированный вызов. synchronized
не является частью сигнатуры метода.
Подробнее см. http://gee.cs.oswego.edu/dl/cpj/mechanics.html от Doug Lea, Java threading boss (или так).
Ответ 2
Вы можете проверить это самостоятельно, написав это:
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;
}
}
И тестовый класс
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
}
}
На моей машине это было 137099 вместо 200000.
Ответ 3
ваш метод Override будет больше не синхронизироваться, если вы переопределите его и удалите synchronized
. Найденный здесь здесь и здесь