Вы когда-нибудь использовали ключевое слово synchronized
в Java?Он используется для формирования очереди потоков, где потоки будут формировать строку для доступа к определенному фрагменту кода.Чтобы определить, должен ли поток ждать, вы передаете экземпляр объекта синхронизированному блоку и, если уже есть другой поток, использующий тот же блок в том же экземпляре, он будет ждать, пока все предыдущие потоки не будут завершены.В этой статье объясняется использование синхронизированных: https://www.geeksforgeeks.org/synchronized-in-java/.
Кроме того, вот пример того, что я имею в виду.Я собираюсь просто использовать экземпляр статического объекта, что означает, что все потоки будут использовать один и тот же экземпляр объекта, что заставит их всех ждать своей очереди:
static Object threadLock = new Object();
void doSomething() {
// region Some code that all threads can execute at once
...
// endregion
// region Synchronized code
synchronized(threadLock) {
// Have your winner logic here. Threads will only go into this block in a first-come-first-served basis.
}
// endregion
}
Вы также можете пометить весь метод как синхронизированный для простоты., но тогда вся логика в методе должна выполняться синхронно, когда в этом нет необходимости.Используйте любой подход по своему усмотрению.