Java - обмен данными между потоками - атомная ссылка или синхронизация
Я делаю видеоигру для 2 игроков, и позиция оппонента обновляется в потоке, потому что у него есть сокет, который постоянно слушает. То, что я хочу поделиться, это положение и ротация.
Поскольку это видеоигра, я не хочу, чтобы основной поток блокировался (или был минимально возможным временем), и я не хочу, чтобы производительность зависела. Итак, из того, что я видел, чтобы поделиться этой информацией, нормальная вещь была бы что-то вроде
class sharedinfo
{
public synchronized read();
public synchronized write();
}
но это заблокировало бы чтение в основном потоке (то же, что рисует видеоигру), пока не будут записаны три значения (или даже больше информации в будущем), а также я прочитал, что синхронизация очень дорога (и это тоже Важно сказать, что эта игра для Android также, поэтому производительность очень важна).
Но я подумал, что, возможно, использование sharedInfo внутри AtomicReference и исключение синхронизированных сделает его более эффективным, потому что он остановится только при обновлении самой ссылки (запись не будет существовать, я создам новый объект и поместу его в atomicreference), также они говорят, что atomic * использует аппаратные операции и более эффективен, чем синхронизированный.
Как вы думаете?
1 ответ
Рассмотрите возможность использования очереди для этого, Java имеет несколько хороших параллельных реализаций очереди. Найдите интерфейс BlockingQueue в java.util.concurrent и узнайте, кто его реализует. Скорее всего, вы нашли подходящие стратегии, которые вы даже не рассматривали.
Прежде чем вы это узнаете, вы захотите обмениваться информацией не только с позициями между вашими потоками, и с помощью очереди вы можете поместить туда разные типы объектов, возможно, с разными приоритетами и т. Д.
Если в вашем коде вы используете интерфейсы (например, Queue или BlockingQueue) в максимально возможной степени (т. Е. В любом месте, кроме места, где создается конкретный экземпляр), действительно легко поменять, какой именно тип очереди вы используете, если вам нужно другой функционал, или просто хочется поиграть.