Hi there, The Semaphore feature was a great addition to Ignite's synchronization primitive toolkit. I'd like to propose an enhancement to make Semaphore API even more useful.
My biggest complaint about the current API is its blocking nature. For example, the only way to acquire a permit is by using the blocking acquire() method (tryAcquire() is not very useful in the cases when you MUST acquire before you can proceed). I believe that in the 21st century blocking APIs is anachronism. :))) It's a bit embarrassing even. I'm sure Ignite can do better than that! :) Usually a permit acquisition is followed by an action, followed by a release of the permit. I propose a simple enhancement to the Semaphore API that will reduce the boilerplate and make it possible to do all of that asynchronously! The new method might look like this: <T> IgniteFuture<T> acquireAndExecute(Callable<T> action); <T> IgniteFuture<T> acquireAndExecute(Callable<T> action, Executor executor); (The name could be improved, of course...) The first method would immediately return a future to be later completed by the action's result. The action will be executed on a thread from the Ignite's public thread pool once a permit has been acquired. Optionally, the user could specify a different executor using the second signature. Would the community be interested in such enhancement? Thanks Andrey PS. A subject for a separate discussion, but I believe that in the next major release Ignite should just drop the clumsy withAsync() API and make all blocking calls explicitly async by returning a future. In my opinion it would greatly simplify the API and make it more modern. Besides, I'm pretty sure that internally Ignite already creates futures for pretty much most of the API calls, so it should not cause any performance issue.