Если вы можете гарантировать, что все обращения осуществляются с помощью метода передачи, то, вероятно, самый простой подход - это просто сделать передачу синхронизированным методом. Это будет потокобезопасным, потому что это гарантирует, что только один поток будет одновременно выполнять метод передачи.
Если другие методы также могут получить доступ к AccountService, вы можете решить, чтобы все они использовали одну глобальную блокировку. Простой способ сделать это - заключить весь код, который обращается к AccountService, в синхронизированный блок (X) {...}, где X - это некоторый экземпляр общего / одноэлементного объекта (который может быть самим экземпляром AccountService). Это будет потокобезопасным, потому что только один поток будет одновременно получать доступ к AccountService, даже если они используют разные методы.
Если этого по-прежнему недостаточно, вам придется использовать более сложные подходы к блокировке. Один из распространенных подходов заключается в индивидуальной блокировке учетных записей перед их изменением ... но тогда вы должны быть очень осторожны, чтобы устанавливать блокировки в согласованном порядке (например, по идентификатору учетной записи), в противном случае вы попадете в тупики.
Наконец, если AccountService является удаленной службой, вы попадаете на территорию распределенной блокировки .... если у вас нет докторской степени в области компьютерных наук и многолетнего бюджета на исследования, вам, вероятно, следует избегать этого.