Если есть набор классов, вызовы методов которых должны быть внутренне синхронизированы, то как обычно делают это в сложных проектах:
1) Просто в каждый метод добавить семафор
2) Организовать очередь сообщений (вызовов).
Первый вариант вроде проще, но при добавлении нового метода можно забыть про семафор.
Второй вариант элегантнее, но имеет минусы: надо как-то организовывать возврат результатов, на каждую функцию заводить структуру для её параметров, а также код сообщения.