Si puede garantizar que todos los accesos se realizan a través del método de transferencia, entonces probablemente el enfoque más fácil sea simplemente hacer que la transferencia sea un método sincronizado. Esto será seguro para subprocesos porque esto garantiza que solo un subproceso ejecutará el método de transferencia en cualquier momento.
Si otros métodos también pueden acceder al AccountService, entonces puede decidir que todos ellos utilicen un único bloqueo global. Una manera fácil de hacerlo es rodear todo el código que accede al AccountService en un bloque synchronized (X) {...} donde X es una instancia de objeto shared/singleton (que podría ser la instancia de AccountService en sí misma). Esto será seguro para subprocesos, ya que solo un subproceso accederá al Servicio de cuenta en cualquier momento, incluso si tienen diferentes métodos.
Si eso aún no es suficiente, entonces tendrá que utilizar enfoques de bloqueo más sofisticados. Un enfoque común sería bloquear las cuentas individualmente antes de modificarlas ... pero debe tener mucho cuidado de tomar las cerraduras en un orden coherente (por ejemplo, mediante la identificación de la cuenta), de lo contrario, se encontrará con puntos muertos.
Finalmente si AccountService es un servicio remoto, entonces usted está en el territorio de bloqueo distribuido ... a menos que tenga un doctorado en informática y años de presupuesto de investigación para quemarlo, probablemente debería evitar ir allí.
+1 para evitar el interbloqueo – unbeli
+1: Bloquear siempre los objetos en el mismo orden no puede sobreestresarse. – Powerlord
si el rendimiento no es crítico, y hay un único Servicio de cuenta, también se podría simplemente 'sincronizar' el método de transferencia. – aioobe