You can shift the relevant code or the entire method to a Singleton session bean & apply appropriate locking strategy.
Below are few excerpts from the documentation which will clarify it in more detail.
If a singleton uses container-managed concurrency, the EJB container controls client access to the business methods of the singleton
Annotate the business or timeout method with @Lock(LockType.WRITE) if the singleton session bean should be locked to other clients while a client is calling that method. Typically, the @Lock(LockType.WRITE) annotation is used when clients are modifying the state of the singleton.
If no @Lock annotation is present on the singleton class, the default lock type, @Lock(LockType.WRITE), is applied to all business and timeout methods.
Edit : As a workaround, you can have a stateless session bean with pool size as 1. Specify it with the @Pool
annotation on bean or through xml configuration.
@Pool(value=PoolDefaults.POOL_IMPLEMENTATION_STRICTMAX,maxSize=1,timeout=5000)
Refer here for more details, this is JBoss specific, but can be implemented for other servers differently.