Tôi có siêu lớp Point
và phương thức synchronized
draw()
. Các lớp con của số Point
có kế thừa synchronized
nếu tôi ghi đè phương thức draw()
vào chúng hay tôi phải luôn viết nó?Được đồng bộ kế thừa trong Java?
Trả lời
Không, bạn sẽ luôn phải viết synchronized
. Nếu bạn gọi phương thức đồng bộ của lớp siêu này tất nhiên sẽ là một cuộc gọi được đồng bộ hóa. synchronized
không phải là một phần của chữ ký phương thức.
Xem http://gee.cs.oswego.edu/dl/cpj/mechanics.html để biết mô tả chi tiết từ Doug Lea, Java threading boss (hoặc hơn).
Có thể làm rõ một chi tiết: cho dù cuộc gọi phương thức đã cho có được đồng bộ hay không phụ thuộc vào loại động của đối tượng mà nó được gọi, không phải kiểu tĩnh. Tức là, nếu 'foo()' là 'đồng bộ' trong' Derived' nhưng không phải trong 'Base', và bạn gán một' Derived' vào biến 'Base' và gọi' foo() 'trên đó, cuộc gọi đó sẽ được đồng bộ hóa. Điểm này là ẩn trong 8.4.3.6 của spec ngôn ngữ (mà nói một phương thức 'sync' tương đương với câu lệnh' synchronized' trong phương thức đó), nhưng tôi không thể tìm thấy nó được viết ra ở bất cứ nơi nào khác. Runnable demo [ở đây] (http://runnable.com/U4zBThIj5WNju2g2/). – mrec
Bạn có thể kiểm tra xem nó cho mình bằng cách viết này:
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;
}
}
Và kiểm tra lớp
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
}
}
Trên máy tính của tôi nó là 137.099 thay vì 200000.
Cách dễ dàng hơn để kiểm tra sẽ là kiểm tra trên ['Thread.holdsLock (this);'] (http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#holdsLock% 28java.lang.Object% 29) theo phương pháp ghi đè –
Không trả lời câu hỏi. Mã thử nghiệm chỉ có thể làm lộ một lỗi hoặc một thời gian bất thường do một cái gì đó khác ngoài đồng bộ hóa. Câu trả lời là được tìm thấy trong đặc tả ngôn ngữ. – EJP
@EJP Lúc đầu, tôi nghĩ bạn đã sai. Sau đó, tôi nhận ra bạn thực sự đúng, nhưng khá bi quan ... – Timo
- 1. Java thừa kế vs C# thừa kế
- 2. Thừa kế trong giao diện bộ sưu tập java
- 3. Java enum thừa kế
- 4. Giá trị ghi đè kế thừa thừa kế Java
- 5. Thừa kế liệt kê trong Java?
- 6. Thừa kế và đúc trong Java
- 7. Thừa kế hàm tạo Java?
- 8. Ẩn trường trong Thừa kế Java
- 9. C#: Thừa kế thừa kế
- 10. Java ORM: Nhiều (giao diện) thừa kế
- 11. Thừa kế thừa kế và thừa kế phương thức
- 12. Tìm hiểu hệ thống Java kế thừa
- 13. Thừa kế Java - từ khóa này
- 14. Khối được đồng bộ hóa - Java
- 15. Java đối tượng serialization và thừa kế
- 16. Thừa kế và đa hình Java
- 17. Đối tượng có bộ nhớ thừa kế
- 18. Câu hỏi được đồng bộ hóa Java
- 19. Java Danh sách được đồng bộ hóa
- 20. iPhone - UIImagePickerControllerKho thừa kế kế thừa
- 21. "Đồng bộ" nghĩa là gì trong Java?
- 22. "đồng bộ hóa (điều này)" so với "đồng bộ ((BaseClass) này)" trong Java?
- 23. Thừa kế trong C++
- 24. Thừa kế tài liệu trong kế thừa lớp Python
- 25. Kế thừa nhiệm vụ Gradle thừa kế
- 26. Trường tĩnh có được kế thừa không?
- 27. Truy cập các biến lớp kế thừa trong java
- 28. Phương pháp trọng và thừa kế trong java
- 29. Thừa kế nguồn java bên ngoài trong dự án GWT
- 30. Thừa kế các trường cuối cùng trong Java?
thể trùng lặp của [Trọng một cách đồng bộ phương pháp] (http://stackoverflow.com/questions/10173345/overriding-a-synchronized-method) – Raedwald