Gần đây tôi đã hỏi một câu hỏi làm tôi bối rối.Hoán đổi các biến trong môi trường đa luồng
public void swapEngine(Car a, Car b) {
Engine temp = a.engine;
a.engine = b.engine;
b.engine = temp;
}
Đây không phải là phương pháp an toàn theo chủ đề. Nếu Chủ đề 1 gọi swapEngine(car1, car2)
và sau đó Chủ đề 2 gọi swapEngine(car1, car3)
, có thể cho car2
để kết thúc với công cụ car3
. Cách rõ ràng nhất để khắc phục sự cố này là synchronize
phương pháp.
Đồng bộ hóa phương pháp đưa ra khả năng không hiệu quả tiềm năng. Nếu Chủ đề 1 gọi số swapEngine(car1, car2)
và Chủ đề 2 gọi số swapEngine(car3, car4)
thì sao? Không có cách nào hai chủ đề này có thể gây trở ngại cho nhau. Trong trường hợp này, tình huống lý tưởng sẽ là cho hai luồng để hoán đổi động cơ song song. Đồng bộ hóa phương pháp ngăn cản điều này xảy ra.
Có kỹ thuật nào khác để trao đổi các động cơ này theo cách an toàn trong khi vẫn tận dụng lợi thế của tính song song không?
Chỉnh sửa: Phương thức được thực hiện công khai.
Vâng, bạn có thể thêm Khóa (http://docs.oracle.com/javase/7/docs/api/ java/util/concurrent/locks/Lock.html) đối với các phiên bản Car. Sau đó, bạn có thể khóa chỉ những trường hợp tham gia trao đổi. – mkrakhin
@mkrakhin Điều đó có thể là bế tắc dễ bị thay đổi trong một 'hoán đổi (a, b); hoán đổi (b, a); 'tình huống. – Kayaman
@maba, trong trường hợp đó cùng một chiếc xe không thể có trong hai cửa hàng :) – Kishore