Sitecore has released on 8.2 the publishing service which is not built into the product but it's a service that works really well for that. This is more as an FYI.
But you said you are running on 8.1 so the only way you can get around that is by establishing processes if upgrading is not an option.
For example do all of those users need publishing permissions?
Can you have a role and assign to key users to trigger the publish avoiding the trigger to be pushed at the same time?
Can you have a publish scheduled task which pushes content live at a specific time?
Do you have workflow properly setup which as the last step triggers a publish?
There are all things you can look into and explore but in a nutshell for Sitecore 8.1 and lower versions you are stuck with the out of the box publishing system which behaves exactly like you described.
Update:
If you trigger a publish programatically through the publish manager(custom processor or a simple call to it) your call will end up at some point creating the publish job and setting the jobstate to queued.
Here is the method that does that(cleaned up for clarity):
PublishStatus publishStatus = new PublishStatus();
JobOptions options1 = new JobOptions(nameof (Publish), this.publishManager.GetType().Name, "publisher", (object) this.publishManager, "DoPublish", new object[2]
{
(object) options,
(object) publishStatus
});
options1.AfterLife = TimeSpan.FromMilliseconds((double) (Settings.Publishing.PublishDialogPollingInterval * 2));
options1.ExecuteInManagedThreadPool = Settings.Publishing.ExecuteInManagedThreadPool;
publishStatus.SetState(JobState.Queued);
Job job = JobManager.Start(options1);