Nếu bạn có thể đảm bảo rằng tất cả các truy cập được thực hiện thông qua phương pháp chuyển, thì có lẽ cách tiếp cận dễ nhất là chỉ thực hiện chuyển một phương thức được đồng bộ hóa. Điều này sẽ được an toàn thread bởi vì điều này đảm bảo rằng chỉ có một sợi sẽ chạy phương thức truyền tải cùng một lúc.
Nếu các phương pháp khác cũng có thể truy cập vào AccountService, thì bạn có thể quyết định để tất cả các phương pháp này sử dụng một khóa toàn cầu duy nhất. Một cách dễ dàng để làm điều này là bao quanh tất cả các mã truy cập vào AccountService trong một khối (X) {...} được đồng bộ hóa trong đó X là một đối tượng chia sẻ/singleton (có thể là chính cá thể AccountService). Đây sẽ là luồng an toàn vì chỉ có một luồng sẽ truy cập vào AccountService cùng một lúc, ngay cả khi chúng nằm trong các phương thức khác nhau.
Nếu vẫn chưa đủ, thì bạn sẽ cần phải sử dụng các phương pháp khóa phức tạp hơn. Một cách tiếp cận phổ biến là khóa tài khoản riêng lẻ trước khi bạn sửa đổi chúng ... nhưng sau đó bạn phải rất cẩn thận để lấy khóa theo thứ tự nhất quán (ví dụ: bằng ID tài khoản) nếu không bạn sẽ gặp lỗi.
Cuối cùng nếu AccountService là dịch vụ từ xa thì bạn đang ở trong lãnh thổ khóa phân phối .... trừ khi bạn có bằng tiến sĩ về khoa học máy tính và số năm ngân sách nghiên cứu để ghi bạn có lẽ nên tránh đến đó.
+1 để tránh bế tắc – unbeli
+1: Luôn khóa các đối tượng theo cùng thứ tự không thể bị nhấn quá mức. – Powerlord
nếu hiệu suất không quan trọng, và có một AccountService đơn, người ta cũng có thể đơn giản là 'đồng bộ hóa' phương thức truyền. – aioobe