我有超類Point
和方法draw()
。 Point
的子類會繼承如果我覆蓋方法draw()
在他們或我必須始終寫它?同步在Java中繼承嗎?
28
A
回答
28
不,您將永遠必須編寫。如果你調用超類的synchronized方法,這當然是一個同步調用。不是方法簽名的一部分。
請參閱http://gee.cs.oswego.edu/dl/cpj/mechanics.html以獲取來自Java線程老大(或多或少)的Doug Lea的詳細描述。
+2
也許可以澄清一個細節:給定的方法調用是否同步取決於它所調用的對象的動態類型,而不是靜態類型。也就是說,如果'Derived'中的'foo()'是'synchronized'而不是'Base'中的'synchronized',並且將'Derived'分配給'Base'變量並且調用'foo()',那麼這個調用將會同步。這點在語言規範的8.4.3.6中是隱含的(它說「synchronized」方法等同於該方法中的synchronized語句),但是我找不到它在其他地方拼寫出來。 Runnable演示[這裏](http://runnable.com/U4zBThIj5WNju2g2/)。 – mrec
4
10
您可以通過編寫此檢查自己:
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
相關問題
- 1. java中繼承的同步
- 2. 「繼承」在java中沒有繼承的相同代碼
- 3. 繼承在Java中
- 4. 繼承在Java中
- 5. Djinni支持Java繼承嗎?
- 6. 繼承在Java
- 7. Java繼承與C#繼承
- 8. 在Java中繼承障礙
- 9. T和繼承在Java中
- 10. Java中的繼承
- 11. Java中的繼承
- 12. 在Ember.js中同步承諾
- 13. Java繼承
- 14. Java繼承
- 15. Java繼承類
- 16. Java繼承
- 17. Java繼承
- 18. Java繼承
- 19. Java繼承
- 20. 類繼承java
- 21. Java類繼承
- 22. Java super()繼承
- 23. Java 8支持多重繼承嗎?
- 24. Java不支持多繼承嗎?
- 25. 派生類繼承不同嗎?
- 26. JFlex中可以繼承嗎?
- 27. 在java中,繼承類也繼承自類Object?
- 28. 對象繼承嗎?
- 29. 繼承UINavigationController的步驟
- 30. Java中的繼承問題
的[重寫同步可能重複方法](http://stackoverflow.com/questions/10173345/overriding-a-synchronized-method) – Raedwald