Tôi hy vọng điều này sẽ là đủ thông tin, vì vậy, thông tin này sẽ xuất hiện. Nếu bạn cần thêm thông tin, hãy để ý trong phần bình luận.Khi nào cần sử dụng đồng bộ trong Java
Tôi có một lớp học có hai lớp bên trong. Mỗi lớp bên trong có hai phương thức gọi một phương thức trong lớp ngoài. Vì vậy, nó trông như thế này:
public OuterClass {
private boolean outerMethodHasBeenCalled = false;
private void outerMethod() {
if(!outerMethodHasBeenCalled) {
// do stuff
}
outerMethodHasBeenCalled = true;
}
private FirstInnerClass {
public void someMethod() {
outerMethod();
}
}
private SecondInnerClass {
public void someOtherMethod() {
outerMethod();
}
}
}
Điều quan trọng cần lưu ý là:
- này là dành cho một ứng dụng Android. Các trường hợp của
FirstInnerClass
vàSecondInnerClass
được chuyển đến WebView dưới dạng giao diện JavaScript, vì vậy,someMethod
vàsomeOtherMethod
có thể được gọi bất kỳ lúc nào, không theo thứ tự cụ thể. - Tôi hiện đang gặp sự cố với mã hiện tại (không có từ khóa được đồng bộ hóa) trong đó
outerMethod
được gọi khá nhiều vào cùng một thời điểm (tôi in một thông điệp tường trình và chúng được đặt thời gian vào 1000 giây) các đối tượng khác nhau. Ứng dụng của tôi sau đó 'thực hiện công cụ' hai lần vìouterMethodHasBeenCalled
vẫn sai khiouterMethod
được gọi. Điều này không ổn, và đó chính xác là những gì tôi đang cố gắng ngăn chặn. Ứng dụng của tôi chỉ nên 'thực hiện' một lần và chỉ một lần: lần đầu tiên được gọi làouterMethod
. - Có vẻ như tôi có nhiều phiên bản
OuterClass
nhưng hãy yên tâm rằng chỉ có một phiên bản làOuterClass
.
Điều quan trọng là ứng dụng của tôi 'thực hiện' chỉ là lần đầu tiên outerMethod
được gọi (tôi hy vọng điều đó hiển nhiên bây giờ). Tất cả các cuộc gọi tiếp theo về cơ bản bị bỏ qua. Bất kỳ lớp bên trong nào cũng gọi số outerMethod
trước - không quan trọng.
Vì vậy, việc sử dụng từ khóa được đồng bộ hóa trong trường hợp này có thích hợp không?
+1 cho AtomicBoolean, đã học được điều gì đó mới :) – quaylar